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 :

[POO] Recursion sur un tableau représentant un arbre


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 69
    Points : 46
    Points
    46
    Par défaut [POO] Recursion sur un tableau représentant un arbre
    Bonjour,

    En attendant de mettre en place un modèle Composite / Visitor je souhaiterai pouvoir parcourir correctement mon tableau:

    Le tableau est obtenu à partir d'une table sql.


    Les colonnes importantes sont id et id_parent, ainsi pour chaque enregistrement on peut connaitre son parent.

    Le tableau possède le contenu suivant.


    Ma question est comment parcourir ce tableau de façon récursive et comment retrouver mes petits?

    Merci

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    j'crois que j'ai un peu du mal, mais que tu essays de chercher les petits d'un parent il suffit tout simple d'ajouter :

    WHERE id_parent = 'id du parent en cours'

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Petit soucis, j'arrive pas à voir le rapport entre l'array que tu nous montres et ta table mySql

    Dans le flou, voici une petite méthode assez simple à utiliser qui semble correspondre à ce que tu cherches (ranger tes données hiérarchiquement), il y aura juste un peu d'adaptation à faire pour qu'elle réponde totalement à tes besoins :

    (achtung si tu testes dans un navigateur internet, l'affichage est version CLI, donc à adapter pour du HTML ou à encadrer de balises <pre>)

    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
     
    // définition d'une classe représentant tes données
    class Machin{
    	public $id , $label , $childs = array();
     
    	function __construct( $id , $label ){
    		$this->id = $id;
    		$this->label = $label;
    	}
     
    	function addChild( Machin $machin ){
    		$this->childs[] = $machin;
    	}
     
    	function affiche( $tab = ''){
    		$out = $tab . $this->id . ' -- ' . $this->label . "\n";
    		foreach( $this->childs as $child ){
    			$out .= $child->affiche( $tab . "\t" ) . "\n";
    		}
    		return $out;
    	}
    }
    // définition d'un array temporaire contenant les objets "à plat"
    $mesTrucs = array();
     
     
    // définition de la racine de ta structure de données 
    $racine = new Machin( '0' , 'Racine du bidule' );
     
    // ajout de cette racine au tableau "plat"
    $mesTrucs[0] = $racine;
     
    $q = mysql_query( "SELECT id , id_parent , label FROM matable ORDER BY id_parent ASC, id ASC" );
    while( $data = mysql_fetch_object( $q ) ){
    	//création d'un objet Machin à partir des données de la DB
    	$obj = new Machin( $data->id , $data->label );
     
    	// ajout à la liste plate de l'objet avec comme clé son id
    	$mesTrucs[ $data->id ] = $obj;
     
    	// ajout de l'objet à son parent
    	$mesTrucs[ $data->id_parent ]->addChild( $obj );
    }
     
    // affichage de la structure des machins
    echo $racine->affiche();

  4. #4
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 69
    Points : 46
    Points
    46
    Par défaut
    Merci pour vos réponses,

    En effet le rapport entre la table sql et le tableau est assez flou mais c'est avec cet array que je dois travailler.

    Quoi qu'il en soit, Petitbidon, tu me proposes une classe style Composite et bien que je voulais attendre avant de l'implémenter, je vais devoir m'en servir plus tôt.

    Merci pour ton modèle.

Discussions similaires

  1. Fonction recursive sur un tableau passé en parametre
    Par misterfed dans le forum Langage
    Réponses: 7
    Dernier message: 31/05/2012, 08h22
  2. Select sur une représentation en arbre
    Par ctxctx dans le forum Langage SQL
    Réponses: 17
    Dernier message: 29/11/2011, 15h45
  3. Recursion sur un arbre DOM
    Par crimsonPhantom dans le forum Général Python
    Réponses: 1
    Dernier message: 22/08/2006, 15h41
  4. [POO] Représentation d'arbre (Nested Tree)
    Par zoullou dans le forum Langage
    Réponses: 3
    Dernier message: 20/06/2006, 16h27
  5. [VBA-E] Dim dynamique sur un tableau
    Par Vince69 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/12/2002, 13h32

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