Aller au contenu

fonction recursive > algorithme


smile

Sujets conseillés

Hello,

Je suis en train de bosser sur un script annuaire, categories illimités.

mais ca pose quelques problèmes, surtout algorithmique au niveau des categories.

ma table est composée d'une cat_id et d'une cat_parent

exemple :

1>histoire >0

2>contemporaine>1

3> moyen age> 1

4> geographie >0

5> guerre du golf >2

et ben là j'ai beau retourner le problème dans tous les sens, il me manque toujours une partie de plus si je fait une jointure avec ma table liens, là c'est pire.

donc ma question doit-on obligatoirement passé par une fonction recursive, en combien de requettes peut on afficher toute l'arborescence ?

Merci par avance :)

Lien vers le commentaire
Partager sur d’autres sites

donc ma question doit-on obligatoirement passé par une fonction recursive, en combien de requettes peut on afficher toute l'arborescence ?

Ta question n'est pas très claire : tout dépend de ce que tu veux faire...

Mais admettons que tu veuilles tout bonnement afficher un item, et le chemin qui mène à cet item

Bref tu as une table baptisée items

id_item

libelle

cat_id

En affichant cet item, tu peux récupérer l'ID de catégorie, mais pas le chemin... tu peux effectivement appeler une fonction récursive, baptisée aff_chemin($categorie), qui s'appelle elle-même, tant que le cat_parent n'est pas égal à zéro...

L'idée (c'est peut-être ça qui bloquait) c'est de construire le chemin à l'envers (de la droite vers la gauche)

Etape 1. Guerre du Golfe

Etape 2. Histoire Contemporaine>Guerre du Golfe

Etape 3. Home>Histoire Contemporaine>Guerre du Golfe

En attendant tes précisions, voila les premiers éléments que je peux te donner

Lien vers le commentaire
Partager sur d’autres sites

Oui merci cariboo, c'est exactement ca, je l'ai fait en commencant en effet à l'envers mais mon problème c'est que j'aimerai aussi afficher les categories du meme niveau, tout developper en fait.

un arbre binaire en fait :

>Histoire

>> Contemporaine

>>>> Guerre du Golfe

>> Moyen age

Vous m'avez compris ou c'est moi qui m'exprime mal :)

Modifié par smile
Lien vers le commentaire
Partager sur d’autres sites

Pour faire ça, c'est la fonction récursive inverse...

Tu commences d'abord par lancer une requête sur les têtes de rubriques

SELECT * from categories where cat_parent=0

Sur chacune des catégories ainsi extraites, tu lances une fonction recursive, qui s'appellerait plutôt affiche_enfants($categorie) cette fois-ci.

L'idée, c'est de lancer une requête pour savoir s'il y'a des enfants

$query="SELECT * from categories where cat_parent=".$categorie

Si oui, (resultat non vide) on boucle sur le tableau des catégories renvoyées, et on rappelle la même fonction affiche_enfants pour les catégories enfants du niveau suivant...

Si non, la fonction récursive s'arrête...

Ca marche bien, mais ça génère des requêtes dans tous les sens, ce qui en terme de performance n'est pas terrible, terrible...

Deux solutions : mettre la page générée dans un cache, pour éviter de trop pomper sur la base de données SQL pour pas grand chose...

Ou mettre toutes les categories dans un tableau, avec un select * from categories (il faut pour cela que la table categories ne soit pas trop grande). Après tu peux travailler avec des variables tableaux en mémoire, ce qui en terme de performance est bien mieux...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

en fait, c'est un peu le principe de ce forum. Quand on demande à afficher un message, le programme cherche à quelle catégorie il appartient, puis à quelle catégorie appartient cette catégorie, etc, jusqu'à remonter à la racine. A l'inverse, quelqu'un qui est à l'index des forums peut voir toutes les catégories, et pourquoi par, les premieres sous catégories. Le principe du forum..

Pour cela, il vaut mieux effectivement dépiler toutes tes catégories, et ensuite seulement, travailler avec le tableau généré.

A+, Anonymus.

Lien vers le commentaire
Partager sur d’autres sites

Merci de vos réponses,

en effet ca y'est je viens d'afficher toute l'arborescence sur une page test.

J'ai effectivement travailler avec des tableaux, cette page test sera en cache pour eviter de prendre pas mal de ressources.

Mais là je vois que je ramolis, pas mal d'heures que j'y suis dessus...

c'est pas etonnant que je me suis tapé un carton en cours d'algo :)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...