缺少多维数组树中的节点

时间:2011-04-03 21:10:35

标签: php multidimensional-array

尝试使用以下代码在多维数组中创建树

$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
                                )

                        )

                )

        )

)

我尝试了不同的树生成​​代码示例,但它们都与源数组(如$ source)有相同的问题。请帮助我理解这种行为。

更新 现在我明白了数组有什么问题。但是,如果我在DB中有这样的数据,如何正确选择呢?在使用树生成函数之前,应该对$ source数组进行特殊排序。

1 个答案:

答案 0 :(得分: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已在子元素出现之前定义。

编码逻辑的事实上首先定义父元素,然后定义子元素的定义。一般的做法&标准一直都是一样的。

在我的回答中,我已经正确地改变了元素的出现。这应该有用。

希望它有所帮助。