2010-03-31 4 views
6

La langue est PHP. J'ai un foreach ($ a comme $ b) et un autre foreach ($ c comme $ d => $ e). Comment puis-je les combiner pour lire comme un seul. J'ai fatigué foreach (($ a as $ b) & & ($ c comme $ d => $ e)), mais c'est de la foutaise.Comment combiner deux boucles foreach en une

Répondre

0

Cela fera ce que vous voulez, je pense. Il fera avancer les deux tableaux de manière égale tout au long de votre boucle. Vous pouvez toujours break manuellement si $c est une taille différente de celle $a et vous avez besoin logique de rupture basée sur la taille du tableau:

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

each() fera avancer le pointeur de tableau de $c à chaque itération.

3

Je ne comprends pas ce que vous essayez de faire. Si vous voulez les atteindre l'un après l'autre il suffit d'utiliser deux boucles:

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

Si vous voulez toutes les combinaisons de $a et $c:

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

Je suppose que vous pourriez faire quelque chose comme:

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

mais je ne le conseillerais pas nécessairement.

22

Vous pourriez être intéressé par SPL's MultipleIterator

par exemple

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

impressions

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

C'est la paix la plus intéressante de code que je l'ai vu aujourd'hui. Plus un pour ça. Est-ce que les tableaux DOIVENT être de même longueur, ou arrêtez-vous d'itérer sur un seul d'entre eux à un moment donné? –

+3

Cela dépend si vous définissez l'indicateur MultipleIterator :: MIT_NEED_ANY ou MultipleIterator :: MIT_NEED_ALL. Avec MIT_NEED_ALL, l'itérateur s'arrête si l'un des itérateurs internes n'a plus d'éléments. Avec MIT_NEED_ANY, l'itérateur continue tant qu'au moins un itérateur interne a un autre élément, tous les autres éléments deviennent NULL. MIT_NEED_ALL est la valeur par défaut. – VolkerK

+1

Merci pour l'info, très cool! –

7

1) Méthode Première

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

ou 2) Deuxième méthode

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