【问题标题】:How can I loop through two arrays at once? [duplicate]如何一次循环遍历两个数组? [复制]
【发布时间】:2015-11-10 17:33:23
【问题描述】:

我正在尝试将两个数组排列在一起,但结果总是不正确。我将向您展示我的代码、我得到的结果以及我正在寻找的结果。

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

我的代码:

$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

【问题讨论】:

    标签: php arrays foreach


    【解决方案1】:

    问题

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


    解决方案

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

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

    根据需要使用MultipleIteratorattach 尽可能多的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 方法 (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() 方法 (PHP >=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 >=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 >=5.6,您只需删除参数并在 foreach 循环中将 $numbers 更改为 func_get_args(),然后它也适用于 PHP >=5.3

    【讨论】:

    • 我遇到了这个奇怪的问题,而不是回显我正在使用的值 array_push($somevar, ['item1' => $item1, 'item2' => $item2]);但是 $somevar 在 array_map() 函数中取消注册为数组。我已经将它设置为迭代函数之外的数组。
    • @SarmenB。请使用您当前的代码发布一个指向在线 IDE 左右的小链接。
    • 没关系,我让它与 MultipleIterator 一起工作。但无论如何这是代码pastie.org/private/ppeu5xre2khelnidsowpq
    • 我的意思是 array_push 不是 array_merge(当你看到 sn-p 时)
    • 非常感谢!我现在开始喜欢数组的主题,这是我在菜鸟时会避免的主题。
    【解决方案2】:

    使用 1 中的键获取 2 中的行

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

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 2012-09-29
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多