缺少的节点

问题描述:

试图创建多维数组树下面的代码缺少的节点

$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

原始$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