Function recursive pour arborescence

Eléphant du PHP | 70 Messages

26 mai 2011, 15:05

Bonjour à tous,
Je viens vous demander un peu d'aide car je suis bloqué sur une fonction que je n'arrive pas à créer. J'ai une table dans laquelle mes pages sont stockées et chaque page peut avoir un parent_id.
Je souhaite faire une fonction pour récupérer dans un tableau toute mon arborescence

J'ai une classe Page avec une methode GetList qui me retourne un objet avec toute mes pages sous la forme :

Code : Tout sélectionner

Array ( [0] => Page Object ( [page_id] => 1 [page_nom] => NOM1 [parent_id] => 0 ) [1] => Page Object ( [page_id] => 2 [page_nom] => NOM2 [parent_id] => 0 ) [2] => Page Object ( [page_id] => 3 [page_nom] => NOM3 [parent_id] => 2 ) [3] => Page Object ( [page_id] => 4 [page_nom] => NOM4 [parent_id] => 0 ) [4] => Page Object ( [page_id] => 5 [page_nom] => NOM5 [parent_id] => 0 ) [5] => Page Object ( [page_id] => 6 [page_nom] => NOM6 [parent_id] => 1 ) [6] => Page Object ( [page_id] => 7 [page_nom] => NOM7 [parent_id] => 2 ) [7] => Page Object ( [page_id] => 9 [page_nom] => NOM9 [parent_id] => 1 ) [8] => Page Object ( [page_id] => 10 [page_nom] => NOM10 [parent_id] => 2 ) )
Et je voudrais donc une fonction pour retourner un tableau multidimensionnel de cette forme :

Code : Tout sélectionner

Array ( [0] => Array ( [id] => 1 [name] => NOM1 [children] => Array ( [0] => Array ( [id] => 6 [name] => NOM6 [children] => Array ( ) ) [1] => Array ( [id] => 9 [name] => NOM9 [children] => Array ( ) ) ) ) [1] => Array ( [id] => 2 [name] => NOM2 [children] => Array ( [0] => Array ( [id] => 3 [name] => NOM3 [children] => Array ( ) ) [1] => Array ( [id] => 7 [name] => NOM7 [children] => Array ( ) ) [2] => Array ( [id] => 10 [name] => NOM10 [children] => Array ( ) ) ) ) [2] => Array ( [id] => 4 [name] => NOM4 [children] => Array ( ) ) [3] => Array ( [id] => 5 [name] => NOM5 [children] => Array ( ) ) )
Comment faire une fonction récursive pour obtenir ce dont j'ai besoin.

D'avance merci à tous.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mai 2011, 00:21

C'est fait un peu rapidement, mais ta fonction devrait ressembler à quelque chose de ce genre là :
function maFonctionRecursive($parent=0) {
   $tableau = array();
   $sql = " SELECT ... WHERE parent_id = ". $parent;
   ...
   while(...) { // pour chaque page
      $page_id = ... ; // récup de l'id de la page

      $tableau[] = array( // récup des paramètres et appel récursif
         'id' => $page_id
         , 'name' => $page_nom
         , 'children' => maFonctionRecursive($page_id));
   }
   return $tableau; 
}   
Je pense qu'il y a de meilleures solutions pour éviter un nombre inconnu d'exécution de requête, mais ça te donne au moins une piste :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 70 Messages

27 mai 2011, 11:07

Merci beaucoup Ryle, ta fonction m'a permis de comprendre où était mon erreur, je partage donc ma fonction si ça peut aider

Code : Tout sélectionner

/** * Fonction récursive pour arborescence * * @param nombre $parent pour les catégories ayant cet id_parent * @param nombre $niveau, uniquement pour que la fonction sache ou elle en est * @param array $array spécifie le tableau à passer dans la fonction * * @return array multidimensionnel sous forme d'arborescence */ function recurse_tree($parent, $niveau, $array) { $result = array(); foreach ($array as $noeud) { if ($parent == $noeud['parent_id']) { $result[] = array( 'id' => $noeud['page_id'], 'name' => $noeud['page_nom'], 'children' => recurse_tree($noeud['page_id'], ($niveau + 1), $array) ); } } return $result; }
Bonne journée
A bientôt

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 mai 2011, 16:17

Tu peux optimiser et simplifier un peu ta fonction en virant la partie $niveau, qui au final n'est pas du tout utilisée dans ton traitement :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 5 Messages

10 janv. 2012, 00:43

Bonjour,

Je me casse la tête depuis un moment, j'aimerais également créer une fonction récursive mais qui permet de récupérer tous les dossiers et sous-dossiers (et sous-sous-dossiers...) d'un repertoire...

Par exemple :

Code : Tout sélectionner

Rep_niv1_A/Rep_niv2_A/ /Rep_niv2_B/ /Rep_niv2_C/Rep_niv3_A/ Rep_niv1_B/Rep_niv2_A/Rep_niv3_A/ /Rep_niv3_B/ Devrait retourner $tree = Array ( [0] => Array ( [name] => Rep_niv1_A [folders] => Array ( [0] => Array ( [name] => Rep_niv2_A [folders] => Array ( ) ) [1] => Array ( [name] => Rep_niv2_B [folders] => Array ( ) ) [2] => Array ( [name] => Rep_niv2_C [folders] => Array ( [0] => Array ( [name] => Rep_niv3_A [folders] => Array ( ) ) ) ) [1] => Array ( [name] => Rep_niv1_B [folders] => Array (
Bref et ainsi de suite....

Merci de votre aide!!!

ViPHP
ViPHP | 5462 Messages

10 janv. 2012, 12:03