Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 比较循环中的数组并获取当前数组索引_Php_Arrays_Loops_For Loop - Fatal编程技术网

Php 比较循环中的数组并获取当前数组索引

Php 比较循环中的数组并获取当前数组索引,php,arrays,loops,for-loop,Php,Arrays,Loops,For Loop,我有两个数组要比较,然后用这些属性创建第三个数组。我有第一个数组(array1),它只包含小时时间的顶部值,例如: Array ( [0] => 1393326000 [1] => 1393329600 [2] => 1393333200 [3] => 1393336800 [4] => 1393340400 [5] => 1393344000 [6] => 1393347600 [7] => 1393351200 [8] =&g

我有两个数组要比较,然后用这些属性创建第三个数组。我有第一个数组(array1),它只包含小时时间的顶部值,例如:

Array ( 
[0] => 1393326000 
[1] => 1393329600 
[2] => 1393333200 
[3] => 1393336800 
[4] => 1393340400 
[5] => 1393344000 
[6] => 1393347600 
[7] => 1393351200 
[8] => 1393354800 
[9] => 1393358400 
[10] => 1393362000 
[11] => 1393365600 
[12] => 1393369200 
)
然后我有第二个数据数组,它有我需要的数据,看起来像这样,除了有数千个值。(array2)

所以我基本上是想得到第三个数组,它的键与数组#1相同,但是用数组2中的内容填充
output
字段,除非它不在数组#2中,然后只填充为“0”

所以我最终想要的结果是这样一个数组:

Array ( 
[1393326000] => array ( [output] => 0 ) 
[1393329600] => array ( [output] => 0 ) 
[1393333200] => array ( [output] => 0 ) 
[1393336800] => array ( [output] => 0 ) 
[1393340400] => array ( [output] => 0 ) 
[1393344000] => array ( [output] => 0 )
[1393347600] => array ( [output] => 0 ) 
[1393351200] => array ( [output] => 0 ) 
[1393354800] => array ( [output] => 543 ) 
[1393358400] => array ( [output] => 0 ) 
[1393362000] => array ( [output] => 0 ) 
[1393365600] => array ( [output] => 0 ) 
[1393369200] => array ( [output] => 0 ) 
)
基本上所有值都是0,除了与数据表匹配的值,在本例中为
1393354800

我尝试在第一个数组上运行一个循环,然后使用有用的递归in_数组函数,但我不确定如何获取它在其中找到的同一数组的数组值

// helpful function
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

// do our thing
$newArray = array();
$totalHours = count($array1);

for ($i = 0; $i < $totalHours; $i++) 
{
    $currentHour = $array1[$i];
    if (in_array_r($currentHour, $array2))
    {
        $newArray[$currentHour] = array('output' => ); // Get output of current array index?
    }
    else
    {
        $newArray[$currentHour] = array('output' => '0');
    }
}
//有用的函数
数组中的函数($needle,$haystack,$strict=false){
foreach($haystack作为$item){
if($strict?$item===$needle:$item==$needle)| |(is_数组($item)&&in_数组($needle,$item,$strict))){
返回true;
}
}
返回false;
}
//做我们的事
$newArray=array();
$totalHours=计数($array1);
对于($i=0;$i<$totalHours;$i++)
{
$currentHour=$array1[$i];
if(在数组中($currentHour,$array2))
{
$newArray[$currentHour]=array('output'=>);//是否获取当前数组索引的输出?
}
其他的
{
$newArray[$currentHour]=array('output'=>'0');
}
}
您可能需要按时间对最终数组进行排序(
ksort

这应该可以完成这项工作(没有有用的功能):


这里有一个简单的方法。我稍微编辑了helper函数,这样如果它在草堆中找到了针,它就会返回该项

// helpful function, edited slightly
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return $item;
        }
    }
    return false;
}

$newArray = array();
$totalHours = count($array1);

foreach ($array1 as $key => $value) {
    $result = in_array_r($value, $array2);
    if($result != FALSE) {
        $newArray[$value] = $result['output'];
    }
}

这里有一种方法,首先使用默认值构建
array3
,然后循环
array2
并添加匹配值

$emptyValues = array_fill(0, count($array1), array('output' => 0));
$array3 = array_combine(array_flip($array1), $emptyValues);

foreach ($array2 as $value) {
    if (isset($array3[$value['time']])) {
        $array3[$value['time']]['output'] = $value['output'];
    }
}
尝试一下:

$array_1 = ...; // your first array
$array_2 = ...; // your second array

// get Array #2 into a workable format
// build a map/array with `time` values as keys and `output` values as values
$time_to_output_map = array();
array_walk($array_2, function ($value, $key_not_used) use ($time_to_output_map) {
    $time_to_output_map[$value['time']] = $value['output'];
});

// get the values in array 1 set up as keys
$array_1_flipped = array_flip($array_1);

// merge arrays on keys
$final_array = array();
foreach($array_1_flipper as $key => $value_not_used) {
    if (array_key_exists($key, $time_to_output_map)) {
        $final_array[$key] = $time_to_output_map['$key'];
    } else {
        $final_array[$key] = 0;
    }
}

非常优雅,但这不是假设
$array2
只包含
$array1
中的值,所以
$final
可以包含
$array1
中没有的值吗?你是对的<代码>$times=array\u intersect($times,$array1)会阻止这种情况,嗯,我想你还需要
数组翻转($final)
并使用
数组相交键
,然后
数组翻转
返回。此外,输出数组只包含该值,而不包含另一个关联数组。这仍然是一个很好的解决方案。这些数组映射、数组组合和数组填充键方法与foreach循环相比在速度上如何?它们都是内部循环,所以我很确定最好使用foreach循环。但是如果你在PHP5.5上运行,你可以利用
array\u column
,然后在一个循环中组装你的最终数组,在这个循环中你只比较索引,这是迄今为止最有效的一个索引。唯一的缺点是内部循环基本上每次都运行,所以如果我有24小时,它将运行24次。当我说一个数组中有10000个项目时,这可能是一个问题。不确定是否有解决方法?嗯,它通过使用
unset
来减小数组的大小。如果排序为
$array2
,您还可以在顶部使用第二个
If
进行优化,如
If($o[“time”]>$hour)中断。在最好的情况下,每个外部循环只执行一次内部循环,因为它会立即找到匹配项。是的,我看到了unset,但我认为它不会真的有帮助,因为在
$array1
中最多只有24小时(对不起,应该提到这一点!)。如果
$array2
有10000个项目,并且我们每小时删除一个项目,我们仍然会有大约9976个项目,这可能不会在性能上产生任何明显的差异。但是如果
$array1
中的小时不在
$array2
中,它只会贯穿整个
$array2
,这听起来不大可能。您可能会针对这种情况进行优化,但当前的CPU可能不会让您等待240000次迭代。
// helpful function, edited slightly
function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return $item;
        }
    }
    return false;
}

$newArray = array();
$totalHours = count($array1);

foreach ($array1 as $key => $value) {
    $result = in_array_r($value, $array2);
    if($result != FALSE) {
        $newArray[$value] = $result['output'];
    }
}
$emptyValues = array_fill(0, count($array1), array('output' => 0));
$array3 = array_combine(array_flip($array1), $emptyValues);

foreach ($array2 as $value) {
    if (isset($array3[$value['time']])) {
        $array3[$value['time']]['output'] = $value['output'];
    }
}
$array_1 = ...; // your first array
$array_2 = ...; // your second array

// get Array #2 into a workable format
// build a map/array with `time` values as keys and `output` values as values
$time_to_output_map = array();
array_walk($array_2, function ($value, $key_not_used) use ($time_to_output_map) {
    $time_to_output_map[$value['time']] = $value['output'];
});

// get the values in array 1 set up as keys
$array_1_flipped = array_flip($array_1);

// merge arrays on keys
$final_array = array();
foreach($array_1_flipper as $key => $value_not_used) {
    if (array_key_exists($key, $time_to_output_map)) {
        $final_array[$key] = $time_to_output_map['$key'];
    } else {
        $final_array[$key] = 0;
    }
}