Double boucle foreach

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Double boucle foreach

Re: Double boucle foreach

par nelumbo » 20 mai 2010, 23:36

Merci beaucoup, il me manquait pas grand chose en fait ^^. J'ai du mal à comprendre la logique de fonctionnement des tableaux.

Re: Double boucle foreach

par Ryle » 20 mai 2010, 22:53

Ta première solution est bonne, il suffit juste que $name soit un tableau associatif :
$result = mysql_query("SELECT id, name, root FROM cat", $bdd5);
 $group = array();
 $name = array(); // déclare le tableau
 while ($row = mysql_fetch_assoc($result))
 {
     $name[$row['root']] = $row['name']; // alimente le tableau
     $group[$row['root']][] = $row;
 }
 foreach ($group as $key => $values)
 {
         if($key != '0')
         {
     echo '<optgroup label="'.$name[$key].'">'; // récupère le nom de la catégorie pour la clé
     foreach ($values as $value) 
     {

         echo '<option value="'.$value['id'].'">'.$value['name'].'</option>';
         }       
     }
     echo '</optgroup>';
 }

Re: Double boucle foreach

par nelumbo » 20 mai 2010, 12:10

J'ai trouvé une solution pour me dépanner en créant un tableau qui respecte l'ordre de la clé pour afficher le nom de la catégorie. Mais c'est plus que contraignant si je souhaite ajouter une catégorie mère.
$name = Array(1=> "Chien", "Chat", "Cheval", "Oiseaux", "Rongeur", "Reptile", "Aquarium", "Divers");
 $result = mysql_query("SELECT name, id, root FROM cat ORDER BY root ASC, name ASC", $bdd5);
 $group = array();
 while ($row = mysql_fetch_assoc($result))
 {    
     $group[$row['root']] []= $row;
 }
 foreach ($group as $key => $values)
 {
     echo '<optgroup label="'.$name[$key].'">';
	 
    if($key != '0')
	{	 
        foreach ($values as $value) 
        {
         echo '<option value="'.$value['id'].'">'.$value['name'].'</option>';
	    }	 
    }
  echo '</optgroup>';
 }

Re: Double boucle foreach

par nelumbo » 20 mai 2010, 09:54

Si je récupère le nom comme ci-dessous ca me cela:

Oiseaux
- Labrador
- Caniche
Oiseaux
- Persan
Oiseaux
- Perruche
- Canari
...
 $result = mysql_query("SELECT id, name, root FROM cat", $bdd5);
 $group = array();
 while ($row = mysql_fetch_assoc($result))
 {
     $name = $row['name'];
     $group[$row['root']][] = $row;
 }
 foreach ($group as $key => $values)
 {
 	 if($key != '0')
	 {
     echo '<optgroup label="'.$name.'">';
     foreach ($values as $value) 
     {

         echo '<option value="'.$value['id'].'">'.$value['name'].'</option>';
	 }	 
     }
     echo '</optgroup>';
 }

Re: Double boucle foreach

par Nours312 » 20 mai 2010, 09:14

ben actuellement, tu place en clé $key l'id (champ root) ... et quand tu l'affiche, ça marche bien ... alors pourquoi ne pas entrer en clé le nom ? et laisser tout le reste en place :)

Double boucle foreach

par nelumbo » 19 mai 2010, 23:44

Bonsoir,

Voila plusieurs heures que je bidouille 3 lignes de code mais quand ca veut pas...
je souhaite réaliser un menu déroulant en ordonnant les sous-categories comme ci-dessous.

Chien
- Labrador
- Caniche
Chat
- Persan
Oiseaux
- Perruche
- Canari
...
 $result = mysql_query("SELECT id, name, root FROM cat", $bdd5);
 $group = array();
 while ($row = mysql_fetch_assoc($result))
 {
 $group[$row['root']][] = $row;
 }

  foreach ($group as $key => $values)
 {
      if($key != '0') // les catégories mères ont un 'root' = 0
      {
          echo '<optgroup label="'.$key.'">';
          foreach ($values as $value) 
          {
          echo '<option value="'.$value['id'].'">'.$value['name'].'</option>';
	  }	 
      }
   echo '</optgroup>';
  }
J'arrive à ce résultat:

1
- Labrador
- Caniche
4
- Persan
2
- Perruche
- Canari

Pas moyen d'afficher le nom de la catégorie mère, mais seulement l'id. Au secours !!!