2011-04-12 18 views
10

Soy nuevo en PHP. Tengo dos matrices $array1 y $array2 de igual tamaño. He estado usando foreach bucles para iterar a través de matrices de este modo:¿Puedo iterar a través de dos bucles de igual tamaño con foreach?

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

y

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

pero ahora me gustaría recorrer ambas matrices al mismo tiempo, de modo que tenga acceso a ambos $element1 y $element2 en el cuerpo del bucle.

¿Cómo puedo hacer eso?

+3

¿Las * claves * en la primera matriz son idénticas a las de la segunda? Este detalle dictará la respuesta. – Charles

+0

@Charles Creo que – Adam

+0

excelente, eso lo hace fácil. – Charles

Respuesta

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

Pero para que no falle, si false es un valor permitido en $array1. Si (en este caso) false no está permitido en $array2, sólo puede cambiar tanto

Una solución al "foreach" (si ambos comparten la misma clave)

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

Una tercera (creo que bastante bien,) solución, que simplemente permite que los tipos primitivos en $array1

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

El truco 'next' funcionará siempre que no haya' false's en la primera matriz. – Charles

+0

Sí, lo sé, pero no encontré una solución (no tan compleja) para eso. Sin embargo, agregué otras dos formas y al menos una debería encajar :) La tercera se siente bastante agradable para mí, pero también tiene sus limitaciones. – KingCrunch

1

utilizar un bucle en lugar ...

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

Esto funciona si los índices de las matrices son numéricos y lo mismo para ambas matrices

+0

Solo funciona para matrices numéricas. –

+0

esto no es ** foreach ** loop ... pregunta '¿Puedo iterar a través de dos bucles de igual tamaño con foreach?' Pero sí, funciona para nums como claves :) – Wh1T3h4Ck5

+1

@ Wh1T3h4Ck5, hay más formas de iterar una matriz en PHP que hay para despellejar a un gato. Todos * pueden * ser apropiados en una circunstancia dada. – Charles

0

¿Qué hay de

$i = 0; 
foreach($array1 as $element) { 

    // Do stuff with the element 
    $stuff_from_this_array = $element; 
    $stuff_from_other_array = $array2[$i]; 
    $i++; 

} 

Usted Obviamente quiero poner $ stuff_this_array y $ stuff_from_other_array en algo más persistente, pero quizás esto te da una idea.

+0

Esto se rompe cuando la matriz no tiene teclas secuenciales numéricas. – Charles

2

Each devuelve una matriz que contiene la clave y el valor, y avanza el puntero al siguiente elemento. Devuelve falso una vez que ha avanzado más allá del último elemento.

// 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"; 
} 

Para iterar completamente en ambas matrices, use || en lugar de & &.

+0

... ¡Ni siquiera sabía que podía hacer eso! ¡¡¡ASOMBROSO!!! –

0

Esa es una posible solución. Si comienza con next() directamente, nunca obtendrá el primer elemento de la matriz.

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

} 
Cuestiones relacionadas