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 :

pb algorithmiques : parcours d'arbre


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut pb algorithmiques : parcours d'arbre
    Bonjour,

    Je travaille sur une application PHP, avec une base de donnée Mysql.
    Je bloque sur une fonction qui me permet pour un élément d'une table, de trouver tous ses éléments pères.
    C'est à dire qu'un élément peut en contenir d'autre et/ou être lui même contenu dans un élément.
    En fait la représentation idéale est un arbre :

    Dans ce cas là je cherche tous les chemins menant à l'élément E42 en partant de la racine (E45).

    Voici ma fonction PHP :
    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
    42
    43
    44
    45
    46
    47
    48
    49
     
    function search($id){
     
     
     
     
        //requete qui trouve les papas  
        $req = 'SELECT id_asm, id_assemblages
                FROM assemblages
                WHERE id_composants='.$id.'
                ';  
     
        $res = mysql_query($req);
        $nb = mysql_num_rows($res);
     
     
        if($nb==1){
     
     
            $r = mysql_fetch_array($res);
     
            $c .= $id;
            $c .= '-'.search($r['id_asm']);
     
     
        }elseif($nb>1){
     
     
     
          while ($r = mysql_fetch_array($res)){
     
     
            $c .= $id.'-'.search($r['id_asm']);
     
          }
     
     
        }elseif($nb==0){
     
          $c .= $id.'*';
     
        }
     
     
     
        return $c;
     
     
    }
    Elle me sort le résultat suivant :

    E45-E46-E44-E42*E44-E43-E42*E45-E44-E42*E44-E43-E42*E45-E43-E42*


    Comme vous pouvez le voir, je suis pas loin de la solution, sauf que par ex, pour l'embranchement ou y a l'étoile sur le schéma, la fonction perd le chemin qu'il y a avant l'embrachement étoilé. Je n'arrive pas à avoir le chemin complet. (y a moyen de le récupérer avec des bidouillages sur la chaîne de caractère retournée, mais je prefererais éviter et trouver LA solution propre).
    Si y en a parmis vous qui m'ont déjà lu jusqu'ici et qui se sentent le courage de regarder de plus près mon pb, je les remercie

  2. #2
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    Et si tu prenais dans le sens inverse...

    tu récupére tout t'es E42 et tu remonte vers le premier parent ???

    ca serait beaucoup plus simple

    voici un ti exemple qu'il faudra adapter a ta base

    imaginons la table suivante id, parent_id, nom



    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
     
    $req ="SELECT DISTINCT(id) FROM matable WHERE nom = 'E42'";
    ...
    for (int i=0; i<nb_result; i++)
    {
       echo getParent($row->parent_id)."*";
    }
     
    function getParent($_parentId)
    {
         ...
         $req = "SELECT parent_id FROM matable WHERE id= '".$_parentId."'";
         ...
         if ($row->parent_id != null)
            return $_parentId . "-".getParent($row->parent_id);
     
         return $_parentId;
    }

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    en fait je suis déjà en sens inverse, c'est à dire qu'en réalité E42 est ma racine, et E45 les feuilles. Comme je recherche tous les chemins menant à E45, je pars de cet élément en remontant vers la racine.
    J'ai réussi à bidouiller le résultat obtenu par ma fonction pour avoir les chemins complets. c'est pas tip top mais ça marche.

  4. #4
    Membre averti
    Avatar de UNi[FR]
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2002
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2002
    Messages : 340
    Points : 448
    Points
    448
    Par défaut
    tu pourrais me donner la structure exacte de ta table STP pour que je regarde de plus prés ton algo ?

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 187
    Points : 110
    Points
    110
    Par défaut
    En fait ton modèle n'est pas celui d'un arbre mais d'un graphe...
    Si plusieurs noeuds E42, ta structure de donnée n'est peut etre pas la bonne...

    A mon avis tu devrais changer de structure pour avoir un seul noeud E42 et une table de parenté qui te permet de lier les noeuds et de parcourir ton graphe.

    Ensuite le problème peux etre résolu que récursivement (comme tu le fait) mais il faut inclure dans ta récursion la liste des éléments déja parcouru (pour éviter les boucles).

    P.

Discussions similaires

  1. Parcours d'arbre binaire
    Par canary dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 29/01/2008, 14h41
  2. Parcours d'arbre et sauvegarde en binaire
    Par irons dans le forum C
    Réponses: 8
    Dernier message: 20/06/2007, 22h47
  3. [WD11]Problème de parcours d'arbre
    Par fabpeden dans le forum WinDev
    Réponses: 1
    Dernier message: 17/04/2007, 09h46
  4. [JSTL] Problème de parcours d'arbre en XML
    Par slashmax dans le forum Taglibs
    Réponses: 1
    Dernier message: 04/12/2005, 17h13
  5. Parcours d'arbre sans récursivité
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 12/04/2005, 13h57

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