2011-04-03 124 views
0

試圖創建多維數組樹下面的代碼缺少的節點

$source = array(
(array('id'=>406,'parent'=>0,'title'=>'level_0_406')), 
(array('id'=>270,'parent'=>268,'title'=>'level_0_406_268_270')), 
(array('id'=>271,'parent'=>268,'title'=>'level_0_406_268_271')), 
(array('id'=>272,'parent'=>268,'title'=>'level_0_406_268_272')), 
(array('id'=>273,'parent'=>268,'title'=>'level_0_406_268_273)')), 
(array('id'=>269,'parent'=>268,'title'=>'level_0_406_268_269')), 
(array('id'=>268,'parent'=>406,'title'=>'level_0_406_268')), 
(array('id'=>407,'parent'=>406,'title'=>'level_0_406_407')), 
(array('id'=>274,'parent'=>406,'title'=>'level_0_406_274')), 
(array('id'=>500,'parent'=>407,'title'=>'level_0_406_407_500')), 
); 

$result = array(); 
$links = array(0=>&$result); 

foreach ($source as &$element){ 
    $links[$element['id']] = &$element;  
    $links[$element['parent']]['childs'][$element['id']] = &$element; 
} 

但結果數組不包括源陣列,即幾個節點。節點id = 269,270,271,272,273。

Array 
(
    [childs] => Array 
     (
      [406] => Array 
       (
        [id] => 406 
        [parent] => 0 
        [title] => level_0_406 
        [childs] => Array 
         (
          [268] => Array 
           (
            [id] => 268 
            [parent] => 406 
            [title] => level_0_406_268 
           ) 

          [407] => Array 
           (
            [id] => 407 
            [parent] => 406 
            [title] => level_0_406_407 
            [childs] => Array 
             (
              [500] => Array 
               (
                [id] => 500 
                [parent] => 407 
                [title] => level_0_406_407_500 
               ) 

             ) 

           ) 

          [274] => Array 
           (
            [id] => 274 
            [parent] => 406 
            [title] => level_0_406_274 
           ) 

         ) 

       ) 

     ) 

) 

我嘗試了不同代碼樹生成的例子,但它們都與源數組相同的問題,如$源。請幫我理解這種行爲。

更新 現在我明白數組有什麼問題。但是如果我在DB中有這樣的數據,如何正確選擇呢?在使用樹生成函數之前,應該對$ source數組進行特殊排序。

+1

你的代碼存在幾個問題:?? 1)您有$ links ['id']和$ links ['parent'],但使用$ links ['cat_id']和$ links ['parent_id']。 2)您經常使用引用操作符(&),並且我不確定您的應用程序邏輯是否特別需要該操作符。 3)$ links [$ element ['cat_id']]和$ links [$ element ['parent_id']]可能會相互衝突並重寫彼此: - ? – Khez 2011-04-03 21:23:45

+0

1.rayys names fixed 2.it不是我自己的代碼,只是使用了其中一個解決方案 – OlegEF 2011-04-03 22:18:54

回答

1

原始$source數組值未正確創建。它應該是: -

$source = array(
    (array('id'=>406,'parent'=>0,'title'=>'level_0_406')), 
    (array('id'=>268,'parent'=>406,'title'=>'level_0_406_268')), 
    (array('id'=>407,'parent'=>406,'title'=>'level_0_406_407')), 
    (array('id'=>274,'parent'=>406,'title'=>'level_0_406_274')), 
    (array('id'=>270,'parent'=>268,'title'=>'level_0_406_268_270')), 
    (array('id'=>271,'parent'=>268,'title'=>'level_0_406_268_271')), 
    (array('id'=>272,'parent'=>268,'title'=>'level_0_406_268_272')), 
    (array('id'=>273,'parent'=>268,'title'=>'level_0_406_268_273)')), 
    (array('id'=>269,'parent'=>268,'title'=>'level_0_406_268_269')), 
    (array('id'=>500,'parent'=>407,'title'=>'level_0_406_407_500')), 
); 

如果你仔細觀察,你會發現以前,只有父元素ID 407的子元素是可用的,因爲該元素ID 407已孩子發生之前定義元件。

事實上,您的編碼邏輯首先定義父元素,然後定義子元素。一般的做法&標準也一直如此。

在我的回答中,我正確地改變了元素的出現。這應該工作。

希望它有幫助。

+0

(旁註)這5個缺失節點是無父母的孩子(對於父母268):) +1 – Wh1T3h4Ck5 2011-04-03 21:34:36

+1

@ Wh1T3h4Ck5 - 好的,據說,根據在問題中構建'$ source',那5個節點肯定是無父母的。現在這些孩子節點有一個父母,他們不再是孤兒。 ;) – 2011-04-03 21:39:32

+0

它確實有幫助。你快速回答。但它看起來像現在我有一個更棘手的問題,因爲$源數組我從數據庫(ORDER BY父)獲得,我不知道如何正確的方式來正確地創建樹。 – OlegEF 2011-04-03 22:01:24