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

Langage PHP Discussion :

Arbre et recherche d'éléments


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut Arbre et recherche d'éléments
    Bonjour

    je bloque actuellement sur un problème, qui me semble être un arbre..
    Je vous explique :

    Je possède une base de données contenant 6 tables (appelons-les T1,T2,T3,T4,T5,T6). Ces tables sont reliées entre-elles de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        T1
    |   |  |
    T4 T3  T2
         |  |
        T5  T6
    Je possède également un tableau $tablo pouvant selon les cas contenir de 1 à 6 de ces éléments (donc par exemple $tablo=T1,T2 ou bien $tablo=T2,T4,T5 voir même $tablo=T1,T2...T6).

    L'idée est donc de récupérer toutes les valeurs dépendant des autres. Si $tablo=T3,T6, je devrais récupérer $resultat=T3,T1,T2,T6

    Je pense donc à un arbre, mais je ne vois pas comment faire pour créer mon arbre en PHP -_- De plus si c'est bien un arbre (confirmation svp?), il faudra sûrement réaliser une fonction de recherche.
    Pour la fonction de recherche, je pense à quelque chose du style :
    "Si count($tablo)>1, alors on part de la première valeur et on recherche le parent jusqu'à avoir trouvé la deuxième valeur, et ainsi de suite pour toutes les valeurs. Si jamais il n'y a plus de parent (donc qu'on se retrouve en T1), on fait le chemin inverse).

    Ais-je raison de fonctionner comme cela? Je n'ai absolument pas le droit de perdre du temps à essayer plusieurs méthodes (ce que j'ai déjà fait -_-), voilà pourquoi je demande confirmation que je suis bien dans le cas d'un arbre, et qu'il n'existe aucune autre manière plus simple de réaliser ce que je souhaite faire

    Merci à tous

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Bon j'ai trouvé la solution par moi-même

    Je poste la réponse au cas où ça intéresserait quelqu'un (il n'y a rien sur internet concernant les arbres comme j'ai fait :/ )
    Voilà donc ce que j'ai 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
    42
    43
    44
     
     
    $arbre["T1"]["id"]="T1";
    $arbre["T1"]["parent"]="T1";  // T1 est la racine
     
    $arbre["T2"]["id"]="T2";
    $arbre["T2"]["parent"]="T1";
     
    $arbre["T3"]["id"]="T23;
    $arbre["T3"]["parent"]="T1";
     
    $arbre["T4"]["id"]="T4";
    $arbre["T4"]["parent"]="T1";
     
    $arbre["T5"]["id"]="T5";
    $arbre["T5"]["parent"]="T3";
     
    $arbre["T6"]["id"]="T6";
    $arbre["T6"]["parent"]="T4";
     
    $j=0;	
     
    $var=count($tablo);	
     
    if($var==1){  // s'il n'y a qu'une table concernée par la requête
    	$tables[0]=$tablo[0];  // le tableau contenant les tables ne contiendra qu'une table
     
    }else if(($var==2) && (($tablo[0]=="T5" && $tablo[1]=="T3") || ($tablo[1]=="T5" && $tablo[0]=="T3"))) { // s'il y a deux éléments, on recherche les cas particuliers
     
    	$resultats[0]="T3";
    	$resultats[1]="T5";
     
    }else{	// si des tables plus ou moins espacées sont concernées
    	foreach($tablo as $element){
    			$resultats[$j]=$arbre[$element]["id"]; // la première case contient lui-même
    			$j++;
    			$resultats[$j]=$arbre[$element]["parent"]; // la case suivante contient le parent de l'élément	
    			$j++;
    			$resultats[$j]=$arbre[$arbre[$element]["parent"]]["parent"]; // la case suivante contient le grand-parent de l'élément	
    			$j++;
    	}
    }
     
    $tablo_tables=array_unique($tables); // on rempli un tableau contenant toutes les tables distinctes que l'on aura à utiliser pour la requête
    Et voilà, on se retrouve avec un tableau final "$tablo_tables" contenant toutes les tables reliant 2 ou plusieurs tables entre-elles

    Pour comprendre le principe que j'ai suivi :
    Etant donné que mon arbre ne contient que 3 niveau, je me permet à chaque élément de $tablo de chercher son parent et son grand-parent. Ensuite il est donc normal que j'ai des doublons (prenez par exemple T5 et T4 : j'aurais 2 fois "T1" dans mon $resultats). Voilà pourquoi je refait un deuxième tableau avec uniquement des valeurs uniques cette fois-ci

    Ca marche parfaitement

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/04/2009, 19h05
  2. A* , graphe , arbre de recherche
    Par guillaume07 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 27/08/2006, 22h28
  3. Arbre de recherche : quel algo conseiller ?
    Par cedico dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/12/2005, 12h07
  4. [SET]Recherche d'éléments communs à 2 sets
    Par CappCorp dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 03/01/2005, 18h03
  5. [JDOM] Recherche d'éléments en JDOM
    Par newfsch dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/04/2004, 19h33

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