2009-05-08 7 views
4

je dois transformer ma structure imbriquée ensembles (mysql) en JSON pour cette spacetree 1) http://blog.thejit.org/wp-content/jit-1.0a/examples/spacetree.htmlensembles emboîtés, tableau php et de transformation

J'ai trouvé cette fonction pour créer un tableau à partir des ensembles imbriqués: 2) http://semlabs.co.uk/journal/converting-nested-set-model-data-in-to-multi-dimensional-arrays-in-php

Je peux également convertir tableau php en JSON avec la fonction PHP json_encode

Mon problème: la fonction nestify (de la deuxième lien) me donne pas exactement ce que j'ai besoin. J'ai besoin de quelque chose comme ceci: http://pastebin.com/m68752352

Pouvez-vous m'aider à changer la fonction "nestify" afin qu'elle me donne le bon tableau?

est ici cette fonction une fois de plus:

function nestify($arrs, $depth_key = 'depth') 
    { 
     $nested = array(); 
     $depths = array(); 

     foreach($arrs as $key => $arr) { 
      if($arr[$depth_key] == 0) { 
       $nested[$key] = $arr; 
       $depths[$arr[$depth_key] + 1] = $key; 
      } 
      else { 
       $parent =& $nested; 
       for($i = 1; $i <= ($arr[$depth_key]); $i++) { 
        $parent =& $parent[$depths[$i]]; 
       } 

       $parent[$key] = $arr; 
       $depths[$arr[$depth_key] + 1] = $key; 
      } 
     } 

     return $nested; 
    } 

Répondre

8

L'extrait suivant devrait faire l'affaire, adapté de un code Doctrine PHP j'ai trouvé sur le web:

function toHierarchy($collection) 
{ 
     // Trees mapped 
     $trees = array(); 
     $l = 0; 

     if (count($collection) > 0) { 
       // Node Stack. Used to help building the hierarchy 
       $stack = array(); 

       foreach ($collection as $node) { 
         $item = $node; 
         $item['children'] = array(); 

         // Number of stack items 
         $l = count($stack); 

         // Check if we're dealing with different levels 
         while($l > 0 && $stack[$l - 1]['depth'] >= $item['depth']) { 
           array_pop($stack); 
           $l--; 
         } 

         // Stack is empty (we are inspecting the root) 
         if ($l == 0) { 
           // Assigning the root node 
           $i = count($trees); 
           $trees[$i] = $item; 
           $stack[] = & $trees[$i]; 
         } else { 
           // Add node to parent 
           $i = count($stack[$l - 1]['children']); 
           $stack[$l - 1]['children'][$i] = $item; 
           $stack[] = & $stack[$l - 1]['children'][$i]; 
         } 
       } 
     } 

     return $trees; 
} 
+0

Quelqu'un peut-il me dire ce que le '&' fait par exemple '$ pile [] = & $ arbres [$ i];' –

+1

Il stocke la référence de l'élément de l'arbre dans la pile (qui est juste un pointeur vers l'objet actuel au lieu d'une copie de il). Pour plus d'informations, vous pouvez lire le chapitre [Références expliquées] (http://php.net/manual/fr/language.references.php) du manuel PHP. – wimvds

+0

Chose importante. Pour utiliser cette fonction, vous devez appliquer des éléments de commande de la colonne 'collection' par' left_id' (c'est le champ de service de la structure des ensembles imbriqués)! – userlond