缺少的节点
试图创建多维数组树下面的代码缺少的节点
$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数组进行特殊排序。
原始$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
已孩子发生之前定义元件。
事实上,您的编码逻辑首先定义父元素,然后定义子元素。一般的做法&标准也一直如此。
在我的回答中,我正确地改变了元素的出现。这应该工作。
希望它有帮助。
(旁注)这5个缺失节点是无父母的孩子(对于父母268):) +1 – Wh1T3h4Ck5 2011-04-03 21:34:36
@ Wh1T3h4Ck5 - 好的,据说,根据在问题中构建'$ source',那5个节点肯定是无父母的。现在这些孩子节点有一个父母,他们不再是孤儿。 ;) – 2011-04-03 21:39:32
它确实有帮助。你快速回答。但它看起来像现在我有一个更棘手的问题,因为$源数组我从数据库(ORDER BY父)获得,我不知道如何正确的方式来正确地创建树。 – OlegEF 2011-04-03 22:01:24
你的代码存在几个问题:?? 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
1.rayys names fixed 2.it不是我自己的代码,只是使用了其中一个解决方案 – OlegEF 2011-04-03 22:18:54