Могу ли я перебирать две петли равного размера с помощью foreach?

Я новичок в PHP. У меня есть два массива $array1 и $array2 равного размера. Я использовал циклы foreach для итерации по массивам следующим образом:

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

и

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

но теперь я хотел бы перебирать оба массива одновременно, чтобы у меня был доступ к тегам $element1 и $element2 в теле цикла.

Как это сделать?

Ответ 1

while (($element1 = next($array1)) !== false) {
  $element2 = next($array2);
  // Do something
}

Но это не удастся, если false является допустимым значением в $array1. Если (в этом случае) false не разрешено в $array2, вы можете просто заменить оба

A "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
}

Ответ 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

используйте цикл for вместо...

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

Это будет работать, если индексы массивов являются числовыми и одинаковыми для обоих массивов

Ответ 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

Это возможное решение. Если вы начинаете с next() напрямую, вы никогда не получите первый элемент массива.

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

}