如何一次循环遍历两个数组?
我正在尝试将两个数组排列在一起,但结果总是不正确.我将向您展示我的代码、我得到的结果以及我正在寻找的结果.
I am trying to arrange two arrays together and the results keep coming out incorrect. I'll show you my code, the results I'm getting and the results I'm looking for.
我想我只是做错了,但不知道该怎么做.
I guess I'm just doing it wrong but not sure how else to do it.
我的代码:
$data1 = [
'a: 1',
'a: 2',
'a: 3',
'a: 4',
'a: 5'
];
$data2 = [
'b: 1',
'b: 2',
'b: 3',
'b: 4',
'b: 5'
];
foreach($data1 as $item1)
{
foreach($data2 as $item2)
{
echo $item1 . '<br/>';
echo $item2 . '<br/>';
echo '<br/><br/>';
}
}
结果:(缩短以节省空间)
The Results: (shortened to save space)
a: 1
b: 1
a: 1
b: 2
a: 1
b: 3
a: 1
b: 4
a: 1
b: 5
我正在寻找的结果如下:
The results I'm looking for is the following:
a: 1
b: 1
a: 2
b: 2
a: 3
b: 3
a: 4
b: 4
a: 5
b: 5
推荐答案
问题
问题当然是您的嵌套 foreach 循环.因为对于您的 $data1
数组的每个元素,您都会遍历整个 $data2
数组(所以总共有 $data1
* $data2
次迭代).
Problem
Well the problem is of course your nested foreach loop. Because for each element of your $data1
array you loop through the entire $data2
array (So in total there are $data1
* $data2
iterations).
要解决这个问题,您必须同时遍历两个数组.
To solve this you have to loop through both arrays at once.
您可以使用 array_map()
并将所有要同时循环的数组传递给它.
You can do this with array_map()
and pass all arrays to it which you want to loop through at the same time.
array_map(function($v1, $v2){
echo $v1 . "<br>";
echo $v2 . "<br><br>";
}, $data1, $data2 /* , Add more arrays if needed manually */);
注意:如果元素的数量不均匀,你不会产生任何错误,它只会打印 NULL
(意味着你不会看到任何东西)
Note: If the amount of elements are uneven you won't gen any errors, it will just print NULL
(Means you won't see anything)
使用 MultipleIterator
和 附加 ArrayIterator
根据需要.
Use a MultipleIterator
and attach as many ArrayIterator
as you need.
$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>";
}
注意:如果元素的数量不均匀,它将只打印两个数组仍有值的所有值
Note: If the amount of elements are uneven it will just print all values where both arrays still have values
使用带有计数器变量的 for 循环,您可以将其用作两个数组的键.
Use a for loop with a counter variable, which you can use as key for both arrays.
$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
作为值访问.
Or if the arrays only have unique values, you can array_combine()
both arrays, so that $data1
can be accessed as key and $data2
as value.
foreach(array_combine($data1, $data2) as $d1 => $d2) {
echo $d1 . "<br>";
echo $d2 . "<br><br>";
}
注意:数组必须有相同数量的元素,否则array_combine()
会抛出错误
Note: The arrays must have the same amount of elements, otherwise array_combine()
will throw an error
如果您想同时打印超过 2 个数组或只打印未知数量的数组,您可以将 array_map()
方法与 call_user_func_array()
调用.
If you want to print more than 2 arrays at the same time or just an unknown amount of arrays, you can combine the array_map()
method with a call_user_func_array()
call.
$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,您只需删除参数并使用 $numbers.func-get-args.php" rel="noreferrer">func_get_args()
在 foreach 循环中,然后它也适用于 PHP >=5.3
Note: Since this kinda uses the array_map()
method, it behaves the same with uneven amount of elements. Also since this method only works for PHP >=5.6 you can just remove the arguments and change out $numbers
with func_get_args()
in the foreach loop and then it also works for PHP >=5.3
相关文章