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 :

Génération d'arbre hiérarchique


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut Génération d'arbre hiérarchique
    Bonjour à tous,

    Supposons que l'on ait l'objet suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class monObjet
    {
      protected $_id;
      protected $_name;
      protected $_parentId; // peut être null
      ...
    }
    Comme vous l'aurez compris, derrière le concept c'est que un monObjet peut en référencer un autre.

    Maintenant, supposons que par un moyen X ou Y je récupère un ensemble de ces objets (un array).

    Quelle est la méthode la plus simple et rapide pour obtenir un tableau représentant la hiérarchie de ces objets ?
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    obj1 : {id:1, parentId: 8}
    obj2 : {id:2, parentId: 3}
    obj3 : {id:3, parentId: null}
    obj4 : {id:4, parentId: 5}
    obj5 : {id:5, parentId: 3}
    obj6 : {id:6, parentId: 4}
    obj7 : {id:7, parentId: null}
    obj8 : {id:8, parentId: 3}
    supposons que l'on ait le tableau array(obj1,obj2,obj3,...,obj8), comment obtenir quelque chose comme ça (ou mieux soit dit en passant) :
    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
     
    array(
          0 => array(obj7),
          1 => array(
                     0 => obj3
                     1 => array(
                                 0 => obj5
                                 1 => array(
                                            0 => obj4
                                            1 => array(obj6))
                     2=> array(obj2)
                     3=> array(
                                0=>obj8
                                1=>array(1))
                     )
            )
    Merci à quiconque pourra m'aider

  2. #2
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Bonsoir,

    Bon étant donné l'enthousiasme des personnes (peut-être ne suis-je tout simplement pas assez clair dans mes objectifs ... ).

    J'ai réussi à faire ce que je voulais, mais je suis sûr qu'on peut mieux faire ... Qui pourrait apporter son grain de sel ? (je pense notamment à une fonction récursive ... mais laquelle ?)
    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
     
    static function GenerateContainer(array $objects)
    {
        $_parentList     = array();   // Contient la liste des objets parent
        $_objectIdList   = array();   // Contient la liste des id des objets qu'on manipule
        $_objectRootList = array();   // Contient la lsite des object root
     
        // On récupère la liste des object précédent un autre object
        // ainsi que la liste des Id d'object (utilisé plus tard)
        foreach($objects as $_object)
        {
          $_objectIdList[] = $_object->id;
     
          if(!is_null($_object>parentId))
            $_parentList[] = $_object->parentId;
          else
            $_objectRootList[] = $_object;
        }
        $_parentList = array_unique($_parentList);
     
        // Pour chaque object, on génère la liste des object enfants
        foreach($objects as $_object)
          if(in_array($_object->id, $_parentList))
            $_object->setChilds(self::_generateChildsContainer($_object->id,$objects));
     
        // On recherche les object de départ (celle qui ont un précédent qui n'est pas dans la liste des object)
        foreach($objects as $_object)
          if(!is_null($_object->parentId) && !in_array($_object->parentId,$_objectIdList))
            $_objectRootList[] = $_object;
    }
     
    static function _generateChildsContainer($objectId,array $objects)
      {
        $_childs = array();
        foreach($objects as $_object)
          if(!is_null($_object->parentId) && $objectId->id==$_object->parentId)
            $_childs[] = $_object;
     
        return $_childs;
      }

    Si ça en intéresse ... et si y'en a qui peuvent proposer mieux

Discussions similaires

  1. stockage d'un arbre hiérarchique de SPAD
    Par cassor dans le forum R
    Réponses: 0
    Dernier message: 18/12/2013, 12h18
  2. [WPF] Binding dans un arbre hiérarchique
    Par Higgins dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 30/08/2010, 08h43
  3. Génération des arbres et leur placement sur le terrain
    Par Gobelins dans le forum Moteurs 3D
    Réponses: 25
    Dernier message: 22/08/2009, 22h48
  4. [Swing] Arbre hiérarchique
    Par speedster dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/07/2007, 13h09
  5. Quel algorithme utilisé pour faire un arbre hiérarchique
    Par deaven dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 26/01/2005, 21h30

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