Double boucle foreach

Eléphant du PHP | 52 Messages

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 !!!

Mammouth du PHP | 661 Messages

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 :)

Eléphant du PHP | 52 Messages

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>';
 }

Eléphant du PHP | 52 Messages

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>';
 }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

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>';
 }
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 52 Messages

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.