2009-05-08 12 views
4
私はネストされたセットからアレイを作成するために、この機能を発見し、このspacetree 1) http://blog.thejit.org/wp-content/jit-1.0a/examples/spacetree.html

ネストされたセット、PHP配列と変換

ためJSONに私のネストされたセットの構造(MySQLの)変換する必要

: 2)http://semlabs.co.uk/journal/converting-nested-set-model-data-in-to-multi-dimensional-arrays-in-php

私はまた、PHPの関数json_encodeとJSONに

私の問題をPHPの配列を変換することができます(第2リンクから)関数nestifyを与える私はないまさに私が必要とします。私は次のようなものが必要です:http://pastebin.com/m68752352

"nestify"関数を変更して正しい配列を得ることができますか?ここで

は、この関数は、1つのより多くの時間です:

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; 
    } 

答えて

8

次のスニペットは、私がウェブ上で発見いくつかのPHP Doctrineのコードから適応トリック、実行する必要があります。

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

誰が私に何を伝えることができるの'$ stack [] =&$ trees [$ i];' –

+1

これは、ツリー項目の参照をスタックに格納します(これは、現在のオブジェクトのポインタではなく、それ)。詳細については、PHPマニュアルの[References Explained](http://php.net/manual/en/language.references.php)の章を読んでください。 – wimvds

+0

重要なこと。この関数を使用するには、 'collection'の項目を' left_id'(ネストされたセット構造のサービスフィールド)カラムで適用する必要があります。 – userlond