【问题标题】:Can I iterate through two loops of equal size with foreach? [duplicate]我可以用foreach遍历两个大小相等的循环吗? [复制]
【发布时间】:2011-08-04 05:44:25
【问题描述】:

我是 PHP 新手。我有两个大小相等的数组$array1$array2。我一直在使用foreach 循环来遍历数组,如下所示:

foreach($array1 as $element1) {
      //Do stuff with $element1
}

foreach($array2 as $element2) {
      //Do stuff with $element2
}

但现在我想同时遍历两个数组,这样我就可以访问循环体中的$element1$element2

我该怎么做?

【问题讨论】:

  • 第一个数组中的 keys 是否与第二个数组中的相同?这个细节将决定答案。
  • 太棒了,这让这一切变得简单。

标签: php for-loop foreach


【解决方案1】:

这是一个可能的解决方案。如果你直接从 next() 开始,你永远不会得到数组的第一个元素。

reset($array1); reset($array2);
for ($element1 = current($array1), $element2 = current($array2); 
        $element1 !== false && $element2 !== false; 
        $element1 = next($array1), $element2 = next($array2)) {
    // Do something

}

【讨论】:

    【解决方案2】:

    Each 返回一个包含键和值的数组,并将指针前进到下一个元素。一旦超过最后一个元素,它就会返回 false。

    // Iterate until one of the arrays is complete
    while (($a = each($array_a)) !== false && ($b = each($array_b)) !== false) {
        echo "The key:value from array_a is {$a['key']}:{$a['value']}.\n";
        echo "The key:value from array_b is {$b['key']}:{$b['value']}.\n";
    }
    

    要完全遍历两个数组,请使用 ||而不是 &&。

    【讨论】:

    • ...我什至不知道我能做到这一点!太棒了!!!
    【解决方案3】:
    while (($element1 = next($array1)) !== false) {
      $element2 = next($array2);
      // Do something
    }
    

    但如果false$array1 中的允许值,它将失败。如果(在这种情况下)false 不允许在 $array2 中使用,则可以交换两者

    “foreach”解决方案(如果两者共享相同的密钥)

    foreach ($array1 as $i => $element1) {
      $element2 = $array2[$i];
      // Do something
    }
    

    第三种(我认为相当不错的)解决方案,它只允许 $array1 中的原始类型

    foreach (array_combine(array_values($array1), array_values($array2)) as $element1 => $element2) {
      // Do something
    }
    

    【讨论】:

    • 只要第一个数组中没有 falses,next 技巧就会起作用。
    • 是的,我知道,但我没有找到解决方案(不是那么复杂)。但是,我添加了另外两种方式,至少一种应该适合 :) 第三种方式对我来说感觉很好,但它也有其局限性。
    【解决方案4】:

    怎么样

    $i = 0;
    foreach($array1 as $element) {
    
        // Do stuff with the element
        $stuff_from_this_array = $element;
        $stuff_from_other_array = $array2[$i];
        $i++;
    
    }
    

    您显然希望将 $stuff_this_array 和 $stuff_from_other_array 放入更持久的东西中,但也许这会给您一个想法。

    【讨论】:

    • 当数组没有数字顺序键时会中断。
    【解决方案5】:

    改用 for 循环...

    for($i = 0;$i<count($array1);$i++) { 
        /* access $array1[$i] and $array2[$i] here */ 
    }
    

    如果数组的索引是数字的并且两个数组的索引相同,这将起作用

    【讨论】:

    • 仅适用于数值数组。
    • 这不是 foreach 循环...问题Can I iterate through two loops of equal size with foreach?但是,它适用于 nums 作为键 :)
    • @Wh1T3h4Ck5,在 PHP 中迭代数组的方法比给猫剥皮的方法更多。所有这些都可以适用于特定情况。
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多