IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Fonction récursive dans une boucle [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Fonction récursive dans une boucle
    Bonjour,

    J'essaie d'afficher une fonction récursive dans une boucle qui lit une table, et impossible d'afficher correctement le résultat...

    Voici la structure de la table SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id|id_parent|nom
    1 | 0 | Animaux 
    2 | 1 | Chats 
    3 | 0 | Voitures 
    4 | 2 | Siamois
    la boucle classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ($cat =  mysql_fetch_array($rid)) {
    echo "<tr></td>".$cat['id']."</td>";
    echo "<tr></td>".$cat['nom']."</td>";
    echo "<tr></td>".arbre($cat['parent_id'])."</td></tr>";
    }
    La fonction arbre, après 1243 modifs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function arbre($parent) {
    while ($cat =  mysql_fetch_array($res)) 
    {
    if ($cat['id'] != $parent) {
    arbre($cat['id']);
    $sortie = $cat['nom'];
    }else{
    $sortie  = "Racine/$cat[nom]";
    }
    }
    return $sortie;
    }
    Je voudrais afficher pour les 4 lignes de la boucle :
    1 | animaux | Racine
    2 | chats | Racine/animaux
    3 | voitures | Racine
    4 | siamois | Racine/animaux/chats

    Si quelqu'un peut me mettre sur la piste... merci !

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    Salut,

    je me suis penché légèrement sur ton problème et des le début j'ai eu envie de me tourner en particulier vers les requêtes SQL.

    j'ai réalisé rapidement cette requête.. j'ai testé très rapidement sur le même nombre d'enregistrement que toi....

    EDIT :

    j'ai essayé avec un plus grand echantillon c'est moins concluant :/

    je vais voir côté php ^^
    Zend PHP5 Certification
    MySQL 4 Core Certification

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Euh... merci pour ta réponse mais j'avoue ne pas comprendre très bien...
    Ta requête me retourne le contenu de la table telle qu'elle est dans phpMyAdmin ! Exactement comme la mienne. Ce que je veux, c'est l'arbre des catégories en remontant les id_parent. Donc fonvtion récursive obligée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    nom: Animaux - id : 1 - parent : 0
    nom: Chats - id : 2 - parent : 1
    nom: Voitures - id : 3 - parent : 0
    nom: Siamois - id : 4 - parent : 2

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    En ce qui concernet ta fonction ne penses tu pas qu'il serait mieux de remplir un tableau et ensuite le traiter ?

    histoire de faire une seule requête.
    Zend PHP5 Certification
    MySQL 4 Core Certification

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Oui, j'y ai pensé, mais...pour remplir un tableau récursivement...je suis bien obligé d'utiliser une fonction...récursive. Et c'est bien là le prob.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    Moi j'ai un souci avec tes données. En effet Animaux et voitures n'ont pas de parent, c'est logique. Sauf que dans ta table tu représentes cela avec un id_parent = 0 !!!!!

    Ce qui est toalement faux, de mon point de vu uniquement, puisque 0 fais partie des de la plage de valeurs possibles pour un identifiant.
    Et si un id fais partie de la plage valeurs possibles, alors il représente un tuple.
    Ce qui est en contradiciton avec nos deux exemple racines, animaux et voitures.

    En fait, si c'était mon code, Animaux et voitures auraient un id_parent = -1 !!

    Ce qui dès lors créé un point de terminaison pour ta fonction arbre.
    En effet si id_parent = -1, alors on est sur une racine, finie l'appel récursif.

    Sinon voici un bout de code que j'ai testé vite fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?
    function lire()
    {
    	$retour = array();
    	$sql = "SELECT * FROM toto ";
    	$query = mysql_query($sql);
    	while( $res=mysql_fetch_array($query) )
    		$retour[] = $res;
    	return $retour;
    }
     
    function lireUnElement( $id )
    {
    	$sql = "SELECT * FROM toto WHERE id = ". intval($id);
    	$query = mysql_query($sql);
    	$res=mysql_fetch_array($query);
    	return $res;
    }
     
    function arbre($res)
    {
    	if( $res["id_parent"] == -1 )
    	{
    		return "Racine/".$res["nom"];
    	}
    	else
    	{
    		return arbre( lireUnElement( $res["id_parent"] ) )."/".$res["nom"];
    	}
    }
    mysql_connect("localhost", "root", "");
    mysql_select_db ("blog");
    $items = lire();
     
    foreach( $items as $item )
    {
    	echo $item["id"]." - ".$item["id_parent"]." - ".$item["nom"]." --> " . arbre($item) ."<br/>";
    }
     
    ?>
    1 - -1 - Animaux --> Racine/Animaux
    2 - -1 - Voitures --> Racine/Voitures
    3 - 1 - Chats --> Racine/Animaux/Chats
    4 - 3 - Siamois --> Racine/Animaux/Chats/Siamois
    J'ai rajouté quelques fonctions histoire de décomposer et simplifier le problème..

    bye

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour et merci de te pencher sur mon "problème" comme tu l'as fait.
    Je viens de tester ta soluce...pas mal du tout !

    Il me reste cependant à l'adapter, car, comme l'affichage se fait dans un while qui lit la table, le foreach($item as $item) affiche dans la ligne, par exemple "voiture", TOUS les items. Il faut que je passe un param à la fonction pour que sur la ligne voiture, j'ai racine/voitures et pas animaux/chat...etc...

    Je creuse...



    Bingo ! merci beaucoup à toi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $qid = "SELECT id, parent_id, nom FROM table ORDER BY id";
    $rid = mysql_query($qid);
     
    while ($cat =  mysql_fetch_array($rid)) {
    $sortie = "<tr><td>".$cat['nom']."</td>";
    $sortie .=  "<td>".arbre($cat) ."</td></tr>";
    }
    echo $sortie;
    Bonne journée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction mail dans une boucle while
    Par tjoce dans le forum Langage
    Réponses: 5
    Dernier message: 23/04/2010, 18h39
  2. vba fonction split dans une boucle
    Par mymoi dans le forum VBA Access
    Réponses: 6
    Dernier message: 26/05/2009, 10h17
  3. Fonction récursive dans une classe
    Par Orbiplanax dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 16h24
  4. la fonction SOMMEPROD dans une boucle dynamique
    Par Mounamidou dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/10/2007, 16h32
  5. Fonction system() dans une boucle for
    Par banban56 dans le forum C
    Réponses: 3
    Dernier message: 16/06/2007, 18h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo