2009-06-22 18 views
1

J'ai expérimenté avec le modèle Modifié pré-commande Tree Traversal, mon code de test retourne les résultats comme prévu, mais je suis ayant des problèmes pour convertir le tableau 2D en multi- tableau dimensionnel pour le présenter.Trier le jeu de résultats MPTT dans un tableau multidimensionnel PHP

Voici un exemple d'un résultat de menu à 3 niveaux, je dois convertir en un tableau multidimensionnel afin que je puisse itérer dans TAL:

Array 
(
    [0] => Array 
     (
      [CategoryID] => 1 
      [ParentID] => 0 
      [CategoryName] => Default Parent 
      [lt] => 1 
      [rt] => 14 
      [tree_depth] => 1 
     ) 

    [1] => Array 
     (
      [CategoryID] => 8 
      [ParentID] => 1 
      [CategoryName] => SysAdmin 
      [lt] => 2 
      [rt] => 7 
      [tree_depth] => 2 
     ) 

    [2] => Array 
     (
      [CategoryID] => 2 
      [ParentID] => 8 
      [CategoryName] => Linux 
      [lt] => 3 
      [rt] => 4 
      [tree_depth] => 3 
     ) 

    [3] => Array 
     (
      [CategoryID] => 3 
      [ParentID] => 8 
      [CategoryName] => Windows 
      [lt] => 5 
      [rt] => 6 
      [tree_depth] => 3 
     ) 

    [4] => Array 
     (
      [CategoryID] => 5 
      [ParentID] => 1 
      [CategoryName] => Code 
      [lt] => 8 
      [rt] => 13 
      [tree_depth] => 2 
     ) 

    [5] => Array 
     (
      [CategoryID] => 6 
      [ParentID] => 5 
      [CategoryName] => PHP 
      [lt] => 9 
      [rt] => 10 
      [tree_depth] => 3 
     ) 

    [6] => Array 
     (
      [CategoryID] => 7 
      [ParentID] => 5 
      [CategoryName] => Perl 
      [lt] => 11 
      [rt] => 12 
      [tree_depth] => 3 
     ) 

) 

J'ai besoin de structurer les données afin de chaque parent a une clé 'Children' qui est un tableau de tableaux répété, sans limitation sur le nombre d'enfants qu'un parent/enfant/petit-enfant peut avoir, la clé tree_depth est élaborée automatiquement par le SGBD, donc je dois simplement modifier la structure du tableau.

Tous les pointeurs grandement appréciés, j'ai joué avec usort() et array_walk_recursive en vain.

Merci à l'avance

Répondre

3

Je pense qu'un foreach simple peut faire l'affaire ici (avec l'aide de références):

Mettre en place un tableau associatif $menu$cat_id => $element_details_anb_children:

$menu = array(); $ref = array(); 
foreach($tree as $d) { 
    $d['children'] = array(); 
    if(isset($ref[ $d['ParentID'] ])) { // we have a reference on its parent 
     $ref[ $d['ParentID'] ]['children'][ $d['CategoryID'] ] = $d; 
     $ref[ $d['CategoryID'] ] =& $ref[ $d['ParentID'] ]['children'][ $d['CategoryID'] ]; 
    } else { // we don't have a reference on its parent => put it a root level 
     $menu[ $d['CategoryID'] ] = $d; 
     $ref[ $d['CategoryID'] ] =& $menu[ $d['CategoryID'] ]; 
    } 
} 

Cela devrait Construire deux tableaux: le tableau multidimensionnel que vous voulez ($menu) et un tableau plat qui ne contient que des références pour chaque catégorie. À chaque itération, il imbrique la catégorie dans son parent s'il existe déjà (c'est pourquoi je garde la table de référence). Bien sûr, cela ne fonctionne que si votre tableau initial $tree est commandé (c'est-à-dire que le parent vient avant ses enfants).

+0

parfait, autre qu'une petite faute de frappe: if (isset (ref $ [$ d [ 'ParentID']]) { devrait être: if (isset (ref $ [$ d [ 'ParentID' ]])) { Merci beaucoup –

+0

okay, fixe typo. –