2010-01-08 6 views
2

Je dois combiner deux déclaration foreach dans un par exemplephp foreach statment

foreach ($categories_stack as $category) 
foreach ($page_name as $value) 

Je dois ajouter ceux-ci dans la même déclaration foreach

Est-ce possible, si oui, comment?

grâce

+0

Vous souhaitez donc effectuer une itération des éléments des deux tableaux en même temps? – Gumbo

+0

Voulez-vous quelque chose comme ça (je ne dis pas que c'est un code valide): foreach (categories_stack de $ dans la catégorie de $, page_name de $ en valeur $) { } si les tableaux ont des tailles différentes? – Jamol

Répondre

3

Vous pouvez faire foreachs imbriqués si c'est ce que vous voulez. Mais sans le savoir plus de vos données, il est impossible de dire si cela aide:

foreach ($categories_stack as $category) { 
    foreach ($page_name as $value) { 
    } 
} 

Probablement vous voulez imprimer toutes les pages dans une catégorie? Cela ne fonctionnera probablement pas, alors pouvez-vous donner un peu plus d'informations sur la façon dont les tableaux se ressemblent et se rapportent les uns aux autres?

+0

Je ne pense pas qu'il les veut imbriqués. –

+1

Je ne sais pas non plus, mais jusqu'à ce qu'il fournisse plus d'informations, c'est aussi bien que tout le monde. –

0

Pourriez-vous simplement les imbriquer avec des variables en dehors de la portée de la foreach, ou pré-stocker le contenu en tant que tableau similaire à une configuration KVP? Ma réponse est vague mais je ne suis pas vraiment sûr pourquoi vous essayez d'accomplir ceci.

0

Les éléments du tableau ont-ils une correspondance directe les uns avec les autres, c'est-à-dire y a-t-il un élément dans $page_name pour chaque élément dans $categories_stack? Si oui, juste itérer sur les touches et valeurs (en supposant qu'ils ont les mêmes clés):

foreach ($categories_stack as $key => $value) 
{ 
    $category = $value; 
    $page = $page_name[$key]; 

    // ... 
} 
1

C'est là le vénérable boucle est très pratique:

for(
    $i = 0, 
    $n = sizeof($categories_stack), 
    $m = sizeof($page_name); 

    $i < $n && $i < $m; 

    $i++ 
) { 
    $category = $categories_stack[$i]; 
    $value = $page_name[$i]; 

    // do stuff here .... 
} 
+0

Vous pouvez rendre cela beaucoup plus lisible en mettant $ n = min (count ($ categories_stack), count ($ nom_page)) 'au-dessus de la boucle et en utilisant simplement le standard' for ($ i = 0; $ i <$ n; $ i ++) 'format. –

+1

Personnellement, je trouve que mettre la partie init en dehors de 'for()' est moins lisible. De cette façon le _intent_ est clair, c'est initialiser les variables pour la boucle 'for'. Mais c'est juste une question de style, bien sûr, PHP ne s'occupe pas des boucles 'for'. – slebetman

+0

@slebetman Je suis d'accord avec toi sur celui-ci, mais j'ai tendance à l'écrire en dehors de toute façon. C'est étrange. :) –

4

(je suis Je ne suis pas sûr d'avoir complètement compris votre question Je suppose que vous voulez parcourir les deux listes en parallèle)

Vous pouvez le faire en utilisant for comme suit:

$n = min(count($category), count($value)); 
for($c = 0; $c < $n; $c = $c + 1){ 
    $categories_stack = $category[$c]; 
    $pagename = $value[$c]; 
    ... 
} 

Pour obtenir la même chose avec foreach vous avez besoin d'une fonction similaire à la fonction zip() Python.

En Python, ce serait:

for categories_stack, pagename in zip(categories, values): 
    print categories_stack, pagename 

Depuis PHP ne dispose pas d'une fonction zip() standard, vous devrez écrire une telle fonction sur votre propre ou aller avec la solution de boucle for.

+0

Vous vous rendez compte que pour écrire la fonction zip vous avez besoin d'une boucle foreach qui utilise la fonction zip ;-) Bien sûr, il y a toujours la boucle for. – slebetman

+0

@Rahul, cette hypothèse serait seulement correcte dans le même nombre d'éléments de tableau était le même pour les deux pages et les catégories, ce qui est hautement improbable. –

+0

Simple 'for' est la meilleure solution –

1

Sûrement vous pouvez juste fusionner les tableaux avant de boucler?

$data = array_merge($categories_stack, $page_name); 

foreach($data AS $item){ 
... 
} 
2

Cette boucle continuera à la longueur de la plus longue série et retour nulle pour où il n'y a aucun élément correspondant dans l'un des tableaux. Essaye le!

$a = array(1 => "a",25 => "b", 10 => "c",99=>"d"); 
$b = array(15=>1,5=>2,6=>3); 

$ao = new ArrayObject($a); 
$bo = new ArrayObject($b); 
$ai = $ao->getIterator(); 
$bi = $bo->getIterator(); 
for (
    $ai->rewind(),$bi->rewind(),$av = $ai->current(),$bv = $bi->current(); 
    list($av,$bv) = 
     array(
      ($ai->valid() ? $ai->current() : null), 
      ($bi->valid() ? $bi->current() : null) 
     ), 
    ($ai->valid() || $bi->valid()); 
    ($ai->valid() ? $ai->next() : null),($bi->valid() ? $bi->next() : null)) 
{ 
    echo "\$av = $av\n"; 
    echo "\$bv = $bv\n"; 
} 

Je ne peux pas vraiment dire à partir de la question exactement comment vous voulez traverser les deux tableaux.Pour un foreach imbriquée vous écrivez simplement

foreach ($myArray as $k => $v) { 
    foreach ($mySecondArray as $kb => $vb { 
    } 
} 

Cependant, vous pouvez faire toutes sortes de choses avec une utilisation créative des fonctions de rappel. Dans ce cas, une fonction anonyme retourne deux éléments de chaque tableau à chaque itération. Il est alors facile d'utiliser la valeur d'itération en tant que tableau ou de la diviser en variables en utilisant list() comme fait ci-dessous.

Cela a également l'avantage de fonctionner quelle que soit la structure de la clé. Je suis purement basé sur l'ordre des éléments du tableau. Utilisez simplement la fonction de tri appropriée si les éléments sont en panne.

Il ne s'inquiète pas de la longueur des tableaux car il n'y a pas d'erreur signalée, alors assurez-vous de garder un œil sur les valeurs vides.

$a = array("a","b","c"); 
$b = array(1,2,3); 
foreach (
     array_map(
      create_function(
       '$a,$b', 'return array($a,$b);' 
      ) 
      ,$a,$b 
     ) 
     as $value 
    ) 
{ 
    list($a,$b) = $value; 
    echo "\$a = $a\n"; 
    echo "\$b = $b\n"; 
} 

Sortie

$a = a 
$b = 1 
$a = b 
$b = 2 
$a = c 
$b = 3 

Voici une autre pour vous qui arrête sur l'une des listes de fin. Identique à l'utilisation min(count(a),count(b). Utile si vous avez des tableaux de même longueur. Si quelqu'un peut le faire continuer à max(count(a),count(b)) faites le moi savoir.

$ao = new ArrayObject($a); 
$bo = new ArrayObject($b); 
$ai = $ao->getIterator(); 
$bi = $bo->getIterator(); 
for (
    $ai->rewind(),$bi->rewind(); 
    $av = $ai->current(),$bv=$bi->current(); 
    $ai->next(),$bi->next()) 
{ 
    echo "\$av = $av\n"; 
    echo "\$bv = $bv\n"; 
}