Page 1 sur 1

Double boucle foreach

Posté : 19 mai 2010, 23:44
par nelumbo
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 !!!

Re: Double boucle foreach

Posté : 20 mai 2010, 09:14
par Nours312
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 :)

Re: Double boucle foreach

Posté : 20 mai 2010, 09:54
par nelumbo
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

Posté : 20 mai 2010, 12:10
par nelumbo
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

Posté : 20 mai 2010, 22:53
par Ryle
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

Posté : 20 mai 2010, 23:36
par nelumbo
Merci beaucoup, il me manquait pas grand chose en fait ^^. J'ai du mal à comprendre la logique de fonctionnement des tableaux.