如何一次循环两个数组?

时间:2015-08-17 23:22:08

标签: php arrays foreach

我正在尝试将两个数组排列在一起,结果不一致。我会告诉你我的代码,我得到的结果以及我正在寻找的结果。

我想我只是做错了但不知道该怎么做。

我的代码:

cout << "Enter the apartment number: " << endl;
cin >> ap.number;
cout << "Enter the name of the owner: " << endl;
cin >> ap.owner;
cout << "Enter the condition: " << endl;
cin >> ap.condition;

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

$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

2 个答案:

答案 0 :(得分:24)

问题

问题当然是你的嵌套foreach循环。因为对于$data1数组的每个元素,您遍历整个$data2数组(因此总共有$data1 * $data2次迭代。)


解决方案

要解决此问题,您必须立即遍历两个数组。

array_map()方法(PHP&gt; = 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方法(PHP&gt; = 5.3)

根据需要使用MultipleIteratorattach ArrayIterator个。{/ p>

$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方法(PHP&gt; = 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()方法(PHP&gt; = 5.0)

或者,如果数组只有唯一值,则可以array_combine()两个数组,以便$data1可以作为键访问,$data2可以作为值访问。

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

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

call_user_func_array()方法(PHP&gt; = 5.6)

如果您想同时打印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&gt; = 5.6,您可以删除参数并在foreach循环中将$numbers更改为func_get_args(),然后它也适用于PHP&gt; = 5.3

答案 1 :(得分:3)

使用1中的键获取2行

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