问题
问题当然是您的嵌套 foreach 循环。因为对于 $data1 数组的每个元素,您都会遍历整个 $data2 数组(所以总共有 $data1 * $data2 迭代)。
解决方案
要解决这个问题,您必须同时遍历两个数组。
您可以使用array_map() 执行此操作,并将所有要同时循环的数组传递给它。
array_map(function($v1, $v2){
echo $v1 . "<br>";
echo $v2 . "<br><br>";
}, $data1, $data2 /* , Add more arrays if needed manually */);
注意:如果元素的数量不均匀,你不会产生任何错误,它只会打印NULL(意味着你什么都看不到)
根据需要使用MultipleIterator 和attach 尽可能多的ArrayIterator。
$it = new MultipleIterator();
$it->attachIterator(new ArrayIterator($data1));
$it->attachIterator(new ArrayIterator($data2));
//Add more arrays if needed
foreach($it as $a) {
echo $a[0] . "<br>";
echo $a[1] . "<br><br>";
}
注意:如果元素的数量不均匀,它将只打印两个数组仍有值的所有值
使用带有计数器变量的 for 循环,您可以将其用作两个数组的键。
$keysOne = array_keys($data1);
$keysTwo = array_keys($data2);
$min = min(count($data1), count($data2));
for($i = 0; $i < $min; $i++) {
echo $data1[$keysOne[$i]] . "<br>";
echo $data2[$keysTwo[$i]] . "<br><br>";
}
注意:使用array_keys() 只是为了在数组没有相同键或关联的情况下也可以使用。 min() 仅用于循环遍历每个数组具有的元素数
或者如果数组只有唯一值,您可以array_combine() 两个数组,这样$data1 可以作为键访问,$data2 作为值访问。
foreach(array_combine($data1, $data2) as $d1 => $d2) {
echo $d1 . "<br>";
echo $d2 . "<br><br>";
}
注意:数组必须有相同数量的元素,否则array_combine()会抛出错误
如果您想同时打印超过 2 个数组或只打印未知数量的数组,您可以将 array_map() 方法与 call_user_func_array() 调用结合使用。
$func = function(...$numbers){
foreach($numbers as $v)
echo $v . "<br>";
echo "<br>";
};
call_user_func_array("array_map", [$func, $data1, $data2]);
注意:由于这有点使用array_map() 方法,它的行为与不均匀数量的元素相同。此外,由于此方法仅适用于 PHP >=5.6,您只需删除参数并在 foreach 循环中将 $numbers 更改为 func_get_args(),然后它也适用于 PHP >=5.3