Page 1 sur 1

requete sql to array associatif

Posté : 02 juin 2008, 14:15
par Invité
Bonjour a tous,

Je souhaite construire un tableau associatif php à partir d'un requete sql sur une table qui contient des éléments de menu.

La requete doit se faire sur la table "menu" que voici:

Code : Tout sélectionner

CREATE TABLE `menu` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) default NULL, `link` text, `parent` int(11) unsigned NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=104 ;
Comme vous pouvez le voir, chaque item de menu a un champ 'parent' contenant l'id d'un item parent se trouvant dans la même table.

Le champ parent contient 0 si l'item de menu n'a pas de parent (1er niveau).

Mon array php doit représenter les id des menus et pour chaque id de menu, un sous tableau contenant les id des sous-menus correspondants, comme ceci
$menu = array
(
"1"   => array("2", "3", "4"),  //l'id d'élément de menu vaut 1, avec 3 sous menus dont les id sont 2, 3,4
"45" => array( "7", "8"),
"9"   => null                        //cet élément n'a pas de sous menu
);
Est-il possible de construire en 1 seule fois une requete sql qui génère un tel tableau?
Merci pour vos réponses.

Posté : 02 juin 2008, 20:06
par animithra
Bonsoir.

Tu peux essayer selon l'algorithme suivant :

Code : Tout sélectionner

DEBUT //connexion a la base de données //selection de la base //requete de recuperation des menus SELECTION de toutes les donnees DE LA TABLE menu //envoi de la requete TANT QUE il existe un resultat //requete de recuperation des menus enfants SELECTION de toutes les donnees DE LA TABLE menu OU parent VAUT idRécupéré par la requete en cours //envoi de la requete SI il n'existe aucun resultat ALORS idRécupéré > null SINON idRécupéré = new Array(nombre de résultats); TANT QUE il existe un resultat idRécupréré[] = idRécupéré2 FIN TANT QUE FIN SI FIN TANT QUE FIN
Il n'y a plus qu'à traduire en php/sql.

Bonne soirée et bonne progra !

Posté : 03 juin 2008, 10:03
par Invité
super, merci bcp d'avoir pris le temps de m'expliquer tout ça.
2 tites questions:

1- Comment traduire idRécupéré > null en php ? est-ce $idRécupéré = null ?
2- Si j'ai pbien compris, il n'est pas possible de faire une seule grosse requête bourrée de join + conditions ou subselects?

Posté : 03 juin 2008, 10:36
par animithra
Bonjour.
Comment traduire idRécupéré > null en php ? est-ce $idRécupéré = null ?
En fait je voulais écrire => et non pas >, je n'avais pas vu la faute de frappe...

Il s'agit ici de différencier du cas où on créer un tableau.

Je ne pense pas que tu puisses écrire $idRécupéré = new Array(0) mais si tu veux créer une variable $menu qui soit un tableau de tableau tu dois pouvoir faire ça comme ça :

Code : Tout sélectionner

SI il n'existe aucun resultat $menu[$idRécupéré] = $idRécupéré; (ou $nameRécupéré si tu souhaites le titre du menu) SINON $idRécupéré = new Array(nombre de résultats); TANT QUE il existe un resultat $menu[$idRécupréré][] = $idRécupéré2; (ou $nameRécupéré2 si tu souhaites le titre du menu) FIN TANT QUE FIN SI
Si j'ai pbien compris, il n'est pas possible de faire une seule grosse requête bourrée de join + conditions ou subselects?
Peut-être est-il possible de procéder ainsi :

Code : Tout sélectionner

//selection de lensemble des données SELECT * FROM menu; //envoi requete //si le menu ne comporte pas de menu parent SI parentRecupere == 0 //on l'ajoute à la liste des menus ALORS menu[] = idRecupere //sinon SINON //on verifie que le menu parent est declare sous forme de tableau SI IL EXISTE parentRecupere //si c'est le cas on ajout le menu au menu parent ALORS menu[parentRecupere][] = idRecupere SINON //si ce n'est pas le cas ALORS menu[parentRecupere] = new Array() menu[parentRecupere][] = idRecupere FINSI FIN SI
A vérifier dans les deux cas que le code accepte que menu soit un tableau à simple ou à double dimension (normalement php l'accepte mais ce n'est pas totalement correct...)

Bonne progra !