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 :

Tableau à dimensions dynamiques et arborescence [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut Tableau à dimensions dynamiques et arborescence
    Bonjour,
    Je cherche a faire un script qui encastre des tableaux les un dans les autres.... un truc du genre :
    $arraytree=array("Racine"=>array("Branche 1"=>array("Sous Branche1"=>"Feuille 1","Sous Branche 2"=>"Feuille 2"),"Branche2"=>"Feuille 3"));

    Ma Bd :
    Id_Feuille
    Id_Pere
    Nom
    Level

    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
     
    //Pour le moment je fais une file de "niveau" donc l'indice du tableau correspond au niveau.... J'aimerais augenter d'une dim plutot...
     
    function SearchChild($Id, $TabChild=array()){
     
           $Sql="SELECT * FROM arbre_cat WHERE IdPere=".$Id;
        $Result = mysql_query ($Sql) or die (mysql_error ());
        if($Result){
            $Count=mysql_num_rows($Result);
            if($Count>0){
                $TabData=array($Col['Arbre_Id'], $Col['Nom'], $Col['Descr'], $Col['CheminPhoto'], $Col['Level'], $Col['IdPere'], $Col['IdRef'], $Col['IdLevel']);
                $Id=$Col['IdPere'];
                $Liste[$Col['Level']]=$TabData;
                if($Id==NULL)
                    return($Liste);
                else   
                    SearchChild($Id,$Liste);
                }
    	}		
    }
    Suis-je claire????

    Merci,
    Guigo

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hellow,

    Je pense que le plus simple dans ce cas est d'utiliser 3 boucles avec le mot clé GROUP BY.

    Chaque boucle réprésentera un niveau de la hiérarchie de l'array

    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
     
    $array = array();
    $sql = "SELECT racine FROM table GROUP BY racine";
    $q = mysql_query($sql);
    while ($r = mysql_fetch_assoc($q)) {
       $sql2 = "SELECT branche FROM table WHERE racine= '".$r['racine']."' GROUP BY branche";
       $q2 = mysql_query($sql2);
       while ($r2 = mysql_fetch_assoc($q2)) {
          $sql3 = "SELECT feuille FROM table WHERE racine= '".$r['racine']."' AND branche = '".$r2['branche']."'";
          $q3 = mysql_query($sql3);
          while ($r3 = mysql_fetch_assoc($q3)) {
              $array[$r['racine']][$r2['branche']][] = $r3;
          }
       }
    }
    PS : pour bien faire, il faudrait faire des mysql_num_rows() à chaque fois pour bien vérifier qu'on a au moins une ligne

  3. #3
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Ok merki,
    je test et reviens .... :-)

  4. #4
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    J'ai une impression !
    Je suis bloque si j'ai un arbre supperieur a 3 noeuds?

  5. #5
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hmmm oui et non... si les arbres font maximum 4 noeuds, il suffit de boucler une fois de plus

    Par contre, c'est un code très très lourd... il faudrait peut-être revoir la structure de la base de données...

  6. #6
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Justement je suis en pleine restructuration....
    Il me semblais judicieux de construire une table de categorie. Chaque nouvelle ligne pointe vers un pere (ou null si racine). De cette facon ne suis pas limite par un nombre de categorie (cat, souscat, sssouscat, ....)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //structure table
    Arbre_Id
    Nom
    Descr
    CheminPhoto
    Level
    IdPere
    L'interet est donc d'avoir une strusture en arbre ou speudo arbre. Et d'avoir mon package de fonction qui va bien....
    La premiere fonction serait la construction de l'arbre complet.

    As tu des remarques, suggestions, aides pour la structure et tout le reste?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Hello,

    Tu peux t'en sortir sans trop de prise de tête avec un peu de POO et deux arrays. Une pour la racine, une fourre-tout.
    chaque objet ( appelé Truc dans la suite de l'explication ) contient les données que tu tires de ta table, et un array contenant ses sous-catégories directes.

    Je te laisse le code, c'est pas très compliqué et c'est plus amusant comme ça . Je te donne juste le scénario :

    Si idPere = 0, c'est la racine, on cree donc un nouvel objet dans la liste racine :
    racine[ id_recup ] = new Truc( tes_donnees_recupérées )
    et on copie cet objet dans la liste fourre-tout parce que c'est plus simple ensuite.
    fourre_tout[ id_recup ] = racine[ id_recup ]

    Si idPere != 0, c'est donc une sous-catégorie. On crée l'objet dans le fourre tout.
    fourre-tout[ id_recup ] = new Truc( tes_données_récupérées )
    et on le passe à son objet "père" pour qu'il le référence dans sa liste de sous éléments.
    fourre-tout[ idPere ]->ajouter( fourre-tout[ id_recup ] )

    Reste plus qu'à ajouter une méthode récursive à ton objet pour afficher tout ça.

  8. #8
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    j'aurai une seule remarque : on essaye toujours d'éviter les arbres infinis dans une table...

    Mieux vaut séparer tes données dans plusieurs tables

  9. #9
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    Hello,

    Tu peux t'en sortir sans trop de prise de tête avec un peu de POO et deux arrays. Une pour la racine, une fourre-tout.
    chaque objet ( appelé Truc dans la suite de l'explication ) contient les données que tu tires de ta table, et un array contenant ses sous-catégories directes.

    Je te laisse le code, c'est pas très compliqué et c'est plus amusant comme ça . Je te donne juste le scénario :

    Si idPere = 0, c'est la racine, on cree donc un nouvel objet dans la liste racine :
    racine[ id_recup ] = new Truc( tes_donnees_recupérées )
    et on copie cet objet dans la liste fourre-tout parce que c'est plus simple ensuite.
    fourre_tout[ id_recup ] = racine[ id_recup ]

    Si idPere != 0, c'est donc une sous-catégorie. On crée l'objet dans le fourre tout.
    fourre-tout[ id_recup ] = new Truc( tes_données_récupérées )
    et on le passe à son objet "père" pour qu'il le référence dans sa liste de sous éléments.
    fourre-tout[ idPere ]->ajouter( fourre-tout[ id_recup ] )

    Reste plus qu'à ajouter une méthode récursive à ton objet pour afficher tout ça.
    sauf qu'avec cette méthode, d'apres le code que j'ai pu comprendre... seule la racine est à 0...

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Oui j'ai oublié de préciser

    Une fois la structure des données finalisée, il faut oublier la liste fourre-tout.

    Par le jeu des passages d'objets par référence, tout est bien structuré à partir de la liste racine.

    par contre il est nécessaire de créer une méthode d'affichage récursive au niveau de la classe Truc

  11. #11
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Est ce que cela vous semble correcte?


    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
     
    function MakeTree($Id){   
        $Sql="SELECT * FROM arbre_cat WHERE Arbre_Id=".$Id;
        $Result = mysql_query ($Sql) or die (mysql_error ());
        if($Result){
            $Count=mysql_num_rows($Result);
            if($Count>0){
    			while($Col=mysql_fetch_array($Result)){
                	$TabData=array($Col['Arbre_Id'], $Col['Nom'], $Col['Descr'], $Col['CheminPhoto'], $Col['Level'], $Col['IdPere'], $Col['IdRef'], $Col['IdLevel']);
                	$Id=$Col['IdPere'];
                	//$FourTout[$Col['Arbre_Id']]=$TabData;
    				if($Level==0){
    					$Arbre[$Col['Arbre_Id']]=$TabData;
    					return $Arbre;
    					exit;	
    				}
    				else{
    					if(!array_key_exists($Col['Arbre_Id'],$Arbre)){
    						$Arbre=array($Col['Arbre_Id']=>$Arbre);
    						MakeTree($Id)
    					}
    				}
     
    			}
    		}
    	}

  12. #12
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    petite modif.... Permet de prendre plusieur Id... Je n'ais pas encore tester, mais j'aimerais savoir si ca vous semble correcte ?

    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
     
     
    function MakeTree($Id){   
        $Sql="SELECT * FROM arbre_cat WHERE Arbre_Id=".$Id;
        $Result = mysql_query ($Sql) or die (mysql_error ());
        if($Result){
            $Count=mysql_num_rows($Result);
            if($Count>0){
    			while($Col=mysql_fetch_array($Result)){
                	$TabData=array($Col['Arbre_Id'], $Col['Nom'], $Col['Descr'], $Col['CheminPhoto'], $Col['Level'], $Col['IdPere'], $Col['IdRef'], $Col['IdLevel']);
     
     
    				if($Level==0){
    					$Arbre[$Col['Arbre_Id']]=$TabData;
    					return $Arbre;
    					exit;	
    				}
    				else{
    					$Id=array($Col['IdPere']);
    					$FourTout[$Col['IdPere']]=array($TabData);
    				}
    			}
    			if(!array_key_exists($Col['IdPere'],$Arbre)){
    				$Arbre=array($Col['IdPere']=>$FourTout[$Col['IdPere']]);//passage de l'arbre
    				MakeTree($Id, $Arbre);
     
     
     
    		}
    	}

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    A première vue, chaque résultat de requête appelle une nouvelle requête.

    Ouille !

    Sans vouloir insister lourdement, jette un œil du coté de la programmation objet (ça mord pas, sisi j't'y jure !), ça te simplifiera grandement la vie, t'évitera une grande consommation d'aspirines lorsque tu reliras ton code plus tard et ta base de données te dira merci

  14. #14
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Mais je veux bien programmer en objet, mais je ne vois pas ce que ca change d'inserer un objet ou un tableau ???

  15. #15
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Si tu es en pleine restructuration, lit cet article :
    http://sqlpro.developpez.com/cours/arborescence/

  16. #16
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Bon du coup je viens de decouvrir UltraTree :-).
    Merci a tous et merki pour la dec de UltreTree....

    Guigo

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Citation Envoyé par guigo Voir le message
    Mais je veux bien programmer en objet, mais je ne vois pas ce que ca change d'inserer un objet ou un tableau ???
    Pourquoi a t'on inventé le concept objet pour les langages de programmation ?

    Parce que ça rend la programmation beaucoup plus facile !

  18. #18
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Moi je programme celon mon besoins.... et dans ce cas la POO n'est pas forcement justifiée, et surtout ne simplifie pas forcement l'algo que je voulais.
    Enfin on va pas refaire le monde ou sur un autre forum.

    @+ et merci pour le coup de patte
    Guigo

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

Discussions similaires

  1. Problème tableau 2 dimensions dynamique
    Par Beaudelicius dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/08/2011, 14h24
  2. Réponses: 0
    Dernier message: 18/03/2010, 15h27
  3. creation d'un tableau double dimension dynamiquement
    Par elmcherqui dans le forum C++
    Réponses: 3
    Dernier message: 09/07/2009, 20h05
  4. Réponses: 17
    Dernier message: 26/04/2007, 10h57
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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