如何一次遍历两个数组?


How can I loop through two arrays at once?

我试图安排两个数组在一起,结果不断出现不正确。我将向您展示我的代码,我得到的结果和我正在寻找的结果。

我想我只是做错了,但不知道还能怎么做。

我代码:

$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/>';
    }
}

结果:(缩短以节省空间)

a: 1
b: 1
a: 1
b: 2
a: 1
b: 3
a: 1
b: 4
a: 1
b: 5

我要找的结果如下:

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迭代)。


解决方案

要解决这个问题,必须同时遍历两个数组。

array_map() method (PHP>=5.3)

你可以在array_map()中这样做,并将你想要同时循环的所有数组传递给它。

array_map(function($v1, $v2){
    echo $v1 . "<br>";
    echo $v2 . "<br><br>";
}, $data1, $data2 /* , Add more arrays if needed manually */);

注意:如果元素的数量不均匀,你不会产生任何错误,它只会打印NULL(意味着你不会看到任何东西)

MultipleIterator method (PHP>=5.3)

使用MultipleIterator,并根据需要附加尽可能多的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 loop method (PHP>=4.3)

使用带有计数器变量的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() method (PHP>=5.0)

或者如果数组只有唯一的值,您可以将两个数组都array_combine(),这样$data1可以作为key访问,$data2可以作为value访问。

foreach(array_combine($data1, $data2) as $d1 => $d2) {
    echo $d1 . "<br>";
    echo $d2 . "<br><br>";
}

注意:数组必须具有相同数量的元素,否则array_combine()将抛出错误

call_user_func_array() method (PHP>=5.6)

如果你想同时打印两个以上的数组或者只是一个未知数量的数组,你可以把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,您可以删除参数并将$numbers更改为foreach循环中的func_get_args(),然后它也适用于PHP>=5.3

use key from 1 to get row in 2

foreach($data1 as $k=> $item1)
{
        echo $item1 . '<br/>';
        echo $data2[$k] . '<br/>';
        echo '<br/><br/>';
}