Requete Mysql et tableaux multidimentionnels

Eléphanteau du PHP | 11 Messages

02 avr. 2010, 14:45

Bonjour à tous,

Grand débutant en PHP et MySQL, je vous lis depuis quelques semaines et j'ai trouvé pas mal de réponses à mes interrogations.
Aujourd'hui je trouve des réponses ici : http://jmolline.free.fr/tutos/comprendre_tableaux.html et http://www.phpdebutant.org/article11.php mais je ne comprends pas.
Voici mon problême :

A partir de mes tables çi-dessous je cherche la requete ainsi que la déclaration d'array qui va permettre d'avoir le résultat suivant :

Renault
Citadine : 1) Clio, 2) Twingo
Berlines : 1) Megane 2) Laguna

Citroen
Citadine : 1) Saxo
Monospace : 1) Picasso

Mes tables :

Constructeur
+---------------------+---------------------+
| id_constructeur | Constructeur |
+---------------------+---------------------+
| 1 | Renault |
+---------------------+---------------------+
| 2 | Citroen |
+---------------------+---------------------+

stock
+---------------------+---------------------+---------------------+
| id_constructeur | Categorie | Modele |
+---------------------+---------------------+---------------------+
| 1 | Citadine | Clio |
+---------------------+---------------------+---------------------+
| 1 | Citadine | Twingo |
+---------------------+---------------------+---------------------+
| 1 | Berline | Megane |
+---------------------+---------------------+---------------------+
| 2 | Citadine | Saxo |
+---------------------+---------------------+---------------------+
| 2 | Monospace | Picasso |
+---------------------+---------------------+---------------------+
| 1 | Berline | Laguna |
+---------------------+---------------------+---------------------+

sur ce site http://www.phpdebutant.org/article11.php j'ai trouvé ce code :

Code : Tout sélectionner

// $constructeur contient la gamme Renault et Citroen // on se contentera de deux constructeurs : ça suffira pour l'exemple :) $constructeur = array(); $constructeur['Renault']['Citadines'] = array('Twingo','Clio'); $constructeur['Renault']['Berlines'] = array('Megane','Laguna'); $constructeur['Renault']['Monospaces'] = array('Scenic','Espace'); $constructeur['Citroen']['Citadines'] = 'Saxo'; $constructeur['Citroen']['Berlines'] = array('Xsara','Xantia'); $constructeur['Citroen']['Monospaces'] = array('Picasso','Evasion'); function afficher_tableau($tableau) { // on fait une boucle qui lit les éléments du tableau foreach ($tableau as $cle=>$valeur) { // si l'un des éléments est lui même un tableau // alors on applique la fonction à ce tableau if(is_array($valeur)) { // on affiche le nom de la clé et // le début d'une liste pour // décaler le contenu vers la droite echo $cle.' : <ul>'; // ici se réalise la récursivité // c'est à dire qu'on applique la fonction // à l'élément en cours car c'est lui aussi un tableau afficher_tableau($valeur); // on ferme la liste echo '</ul>'; } // si ce n'est pas un tableau // alors on affiche le contenu de l'élément else { echo $cle.' = '.$valeur.' <br>'; } } } afficher_tableau($constructeur);
Mais les variables sont déclarées "en dur" dans le code et malgré plusieurs heures de recherche je n'arrive pas à trouver et à creer le tableau qui correspond.

J'espère que vous pourez m'aider
Je vous remercie

Eléphanteau du PHP | 27 Messages

02 avr. 2010, 14:52

Salut, en fait ton code est incomplet

tu désires afficher tes données selon un ordre précis, il te faut donc les trier au préalable

regarde du coté de la fonction usort( ) qui te permettra d'effectuer un tri de manière précise comme toi tu le désires
http://php.net/manual/fr/function.usort.php

Nota: ce n'est pas une chose très facile à faire quand on débute, mais les tableaux sont un très bon apprentissage à faire
Développeur PHP à temps perdu ...
PHP Maximus CMS , un cms plus petit PHP Minimus, un cms minimaliste PHP Nanomus, un pare feu pour votre site PHP Firewall

Eléphanteau du PHP | 11 Messages

05 avr. 2010, 23:15

Merci pour ta réponse,
Je n'ai pas encore trouvé ce que je cherche mais j'avance et je commence à mieux comprendre les tableaux

Mammouth du PHP | 881 Messages

06 avr. 2010, 19:21

Puisque tu parles de bases et de tables, je crois que tu devrais trier tes données directement dans ta requête MySQL. Ensuite, il ne te resterait donc qu'à afficher.
Tu pourrais avoir une requête comme ceci:
SELECT CONS.Constructeur, STOK.Categorie, STOK.Modele FROM Constructeur AS CONS LEFT JOIN stock AS STOK ON STOK.id_constructeur = CONS.id_constructeur ORDER BY Categorie ASC, Modele ASC
ou encore tu peux le faire avec GROUP:
SELECT CONS.Constructeur, STOK.Categorie, STOK.Modele FROM Constructeur AS CONS LEFT JOIN stock AS STOK ON STOK.id_constructeur = CONS.id_constructeur GROUP BY Categorie ORDER BY Modele ASC

Ensuite du récupère tes données par une commande mysql_fetch
Soyez artisans de paix

Eléphanteau du PHP | 11 Messages

16 avr. 2010, 12:41

Bon voila comment j'ai fait. Ce n'est peut-etre pas la meilleure méthode mais ça fait le job.

Code : Tout sélectionner

$sql = "SELECT constructeur.id_constructeur, constructeur.constructeur stock.categorie,stock.modele FROM stock JOIN constructeur ON constructeur.id_constructeur = stock.id_constructeur $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); while ($data = mysql_fetch_array($req) ) { $tableau[$data['constructeur']][$data['categorie']][] = $data['modele']; } if (isset($tableau)) { $i = 1; foreach ($tableau as $cle1=>$valeur1) { if ($i === 1) { $str .= $cle1 . ": "; } else { $str .= "* ".$cle1 . ": "; } $i++; $j = 1; foreach ($valeur1 as $cle2=>$valeur2) { if ($j === 1) { $str .= "Cat: ".$cle2 . ": "; } else { $str .= " - Cat: ".$cle2 . ": "; } $j++; foreach ($valeur2 as $cle3=>$valeur3) { $str .= $valeur3. " "; } } } } else { echo "Pas de données a afficher"; } echo "<br>"; echo $str;