Recursivité

11 réponses
AuteurMessage

Zalex14 |
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 24/11/2006 à 18:28

J'ai un souci simple mais qui me gonfle depuis le début de l'aprem
Je souhaite mettre en base, dans une seule table, une hierarchie (un plan avec des catégories, et sous catégories).
Le nombre de sousniveau est indéfini et l'ordre des éléments peut être amené à changer.
Chaque ligne peut être soit une ligne racine, soit une ligne enfant. J'ai pensé betement que c'était le plus flexible pour la suite.

En gros :

id parent titre
1 0 Titre
2 1 Soustitre
3 1 Soustitre II
4 2 Sous Soustitre
5 0 Titre II
etc..

Au final je souhaite afficher ceci :

Titre
- Soustitre
-- Sous Soustitre
- Soustitre II
Titre II

Pour afficher, je suppose que le plus cohérent est une fonction unique qui va s'appeller elle même pour trouver les "enfants" de chaque ID.
Le problème c'est que là je coince..

J'ai essayé un truc de ce style :


function getParent($id) {
// Je recherche l'enregistrement Parent
$result = mysql_query("SELECT * FROM guides WHERE id=".$id);
if(mysql_num_rows($result) > 0) {
$path = array();
$parent = mysql_fetch_assoc($result);


if($parent['parent'] != 0) {
$path[] = $parent['titre'];
$path = array_merge(getParent($parent['parent']), $path);
}

}
return $path;
}


Mais ca fonctionne pas..
Pis perso les boucles et la récursivité moi ca m'énerve
Quelqu'un aurait un bout de code fonctionnel qui traine au fond d'un de ses tiroirs ??

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 24/11/2006 à 18:33

Moi je fais ma requete, je prends toutes les données (une seule requete) comme ceci :

requete
boucle sur les résultats
{
$CAT[$row['id_parent']][] = $row;
}

function affiche(&$CAT, $id_parent, $decalage = 0)
{
foreach ($CAT[$id_parent] as $row)
{
// traitement sur $row;
// avec $decalage qui vaut le niveau
affiche(&$CAT, $row['id'], $decalage+1);
}
}

affiche($CAT, 0)

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 24/11/2006 à 19:17

C'est cool, Merci Rano !
Je vais tester ça tout de suite

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 25/11/2006 à 02:22

Pour la santé de ton serveur SQL, je te conseille de lire cet excellent article : http://sql.developpez.com/arborescence/Ouvrir dans une nouvelle fenetre

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 25/11/2006 à 13:11

Merci Bool
Ps : tu voulais certainement parler de TON serveur SQL non ?

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

bhamp0 | Benjamin
Membre

Photo de bhamp0

Inscrit le : 09/05/2005

# Le 25/11/2006 à 13:21

Hum ... intéressant comme méthode Bool Une sorte de parcours de l'arbre en préfixe+postfixe ...
Après, il faut voir si on veut gagner du temps lors du SELECT (alors c'est une bonne méthode) ou lors de l'insertion/suppression (mauvaise méthode alors, puisque trois requêtes ...), mais ça permet de voir d'autres solutions
Merci.

Quand on voit c'qu'on voit, et qu'on entend c'qu'on entend, on a raison d'penser c'qu'on pense !

radins | Tobias
Modérateur

Photo de radins

Inscrit le : 09/05/2005

# Le 25/11/2006 à 14:07

Sinon si tu sais le nombre de rubriques et sous rubriques le mieux c'est de faire une table du genre

rub | sous-rub | sous-sous-rub | ...

Il y a donc certes une redondance des infos mais c'est le moyen le plus rapide et qui bouffe le moins de CPU pour ce genre d'hierarchie.

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 25/11/2006 à 14:10

Le mieux est de prendre la methode de base et de tout mettre en cache, je ne pense pas qu'il y ait beaucoup de site qui aient reellement besoin d'avoir des catgeories qui changent 24H / 24H.

Avec un cache (fichier ou meme SQL) des resultats, il n'y a plus d'inconvenients :
- la structure est la plus simple / naturelle / comprehensible
- les requetes sont extremement simple a lire / code
- les performances sont optimums

Apres, il y aura bien sur des sites ou ce ne sera pas adapte, mais il faut pas se prendre la tete 107 ans avec des problemes comme ca

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 25/11/2006 à 14:10

OK merci Tobias, mais ca ne pourra pas fonctionner pour moi.
Le nombre de sous catégories est indéterminé au départ et peut être completement modifié au cours du temps. Il me faut donc une structure très simple et non figée.
Je pense que le lien de Bool va être la solution la plus adaptée pour moi.

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

MathieuC | Mathieu
Modérateur

Photo de MathieuC

Inscrit le : 15/07/2005

# Le 25/11/2006 à 14:11

Si la structure bouge peu (quelques fois par jour), il suffira de regenerer les caches a ce moment la

Zalex14 | Alexandre
Modérateur

Photo de Zalex14

Inscrit le : 09/05/2005

# Le 25/11/2006 à 14:15

Oui, ce n'est pas forcément une question de ressource lors des modifications qui me pose problème.
C'est :
1. que ca fonctionne dans tous les cas sans être une usine à gaz
2. que ca ne fasse pas 150 requetes pour afficher l'arbre
3. que cela soit souple car le nombre de sous niveaux pourra être important
Après ca peut faire dix requetes quand on modifie les catégories, c'est pas ce qui sera le plus sollicité.

Mieux vaut s'attendre au prévisible que d'être surpris par l'inattendu.

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 25/11/2006 à 17:13

Si dans tes pages tu vas afficher à chaque fois tout l'arbre, j'ai pas l'impression que la solution de Bool soit idéale. Si t'affiches tout le temps tout l'arbre, la première solution n'a aucun inconvénient à mon avis. Car de toute façon, niveau traitement des données après (en PHP) tu vas boucler aussi.

Cela dit le lien de Bool est bien instructif et la solution peut s'avérer utile dans certains cas.

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 11:32:38 | Généré en 7.8ms | Contacts | Mentions légales |