2010-03-31 20 views
6

El idioma es PHP. Tengo un foreach ($ a as $ b) y otro foreach ($ c as $ d => $ e). ¿Cómo los combino para leer como uno solo? Me cansé de foreach (($ a as $ b) & & ($ c como $ d => $ e)), pero eso es basura.Cómo se combinan dos bucles foreach en uno

Respuesta

0

Esto hará lo que quieras, creo. Se avanzará en ambas matrices por igual al mismo tiempo a lo largo de su ciclo. Siempre se puede break$c manualmente si es un tamaño diferente al $a y lo que necesita la lógica de ruptura basado en tamaño de la matriz:

foreach($a as $b) 
{ 
    list($d,$e) = each($c); 
    //continue on with $b, $d and $e all set 
} 

each() hará avanzar el puntero de la lista de $c en cada iteración.

3

No entiendo lo que estás tratando de hacer. Si desea llegar a ellos uno tras otro sólo tiene que utilizar dos bucles:

foreach ($a as $b) { ... } 
foreach ($c as $d => $e) { ... } 

si desea que todas las combinaciones de $a y $c:

foreach ($a as $b) { 
    foreach ($c as $d => $e) { 
    // do stuff 
    } 
} 

supongo que se podría hacer algo como:

foreach (array_merge($a, $c) as $k => $v) { 
    ... 
} 

pero no necesariamente lo aconsejaría.

22

Usted puede estar interesado en SPL's MultipleIterator

por ejemplo,

// ArrayIterator is just an example, could be any Iterator. 
$a1 = new ArrayIterator(array(1, 2, 3, 4, 5, 6)); 
$a2 = new ArrayIterator(array(11, 12, 13, 14, 15, 16)); 

$it = new MultipleIterator; 
$it->attachIterator($a1); 
$it->attachIterator($a2); 

foreach($it as $e) { 
    echo $e[0], ' | ', $e[1], "\n"; 
} 

impresiones

1 | 11 
2 | 12 
3 | 13 
4 | 14 
5 | 15 
6 | 16 
+0

Esa es la paz más interesante de código que he visto hoy. Más uno para eso ¿Las matrices TIENEN que ser de la misma longitud, o dejas de iterar en solo una de ellas en algún momento? –

+3

Eso depende de si configura el indicador MultipleIterator :: MIT_NEED_ANY o MultipleIterator :: MIT_NEED_ALL. Con MIT_NEED_ALL, el iterador se detiene si alguno de los iteradores internos no tiene más elementos. Con MIT_NEED_ANY el iterador continúa siempre que al menos un iterador interno tenga otro elemento, todos los demás elementos se vuelven NULL. MIT_NEED_ALL es el valor predeterminado. – VolkerK

+1

Gracias por la información, ¡genial! –

7

1) Primer método

<?php 
$FirstArray = array('a', 'b', 'c', 'd'); 
$SecondArray = array('1', '2', '3', '4'); 

foreach(array_combine($FirstArray, $SecondArray) as $f => $n) { 
    echo $f.$n; 
    echo "<br/>"; 
} 
?> 

o 2) Segundo método

<?php 
$FirstArray = array('a', 'b', 'c', 'd'); 
$SecondArray = array('1', '2', '3', '4'); 

for ($index = 0 ; $index < count($FirstArray); $index ++) { 
    echo $FirstArray[$index] . $SecondArray[$index]; 
    echo "<br/>"; 
} 
?> 
Cuestiones relacionadas