我有一个由嵌套的关联数组组成的树结构。我有一组要添加到树中的路径,其中路径中的每个元素都是节点的名称。下面的代码应该在“a”下创建节点“2”(它确实这样做了),并在“2”下创建节点“i”、“ii”和“iii”。但是由于某种原因,在“2”下创建的第一个节点会丢失。它会打印出它正在被创造,但是
print_r
只显示“ii”和“iii”。
$tree = array(
name => 'root',
children => array(
array(
name => 'a',
children => array( ),
),
),
);
$paths = array(
array('a','2','i'),
array('a','2','ii'),
array('a','2','iii'),
);
foreach ($paths as $path) {
$node =& $tree;
$found = true;
while($found && count($path) > 0) {
$name = $path[0];
$found = false;
echo "looking for $name\n";
foreach ($node['children'] as &$child) {
if($name == $child['name']) {
echo "found $name\n";
$node =& $child;
$found = true;
break;
}
}
if($found) {
array_shift($path);
}
}
if(!$found) {
echo "didn't find $name\n";
while(count($path) > 0) {
$name = array_shift($path);
echo "creating $name in ".$node['name']."\n";
$newNode = array(
'name' => $name,
'children' => array(),
);
$node['children'][] = $newNode;
$node =& $newNode;
}
}
}
print_r($tree);
我怀疑问题与我如何初始化“2”的子级有关,因为它将在循环内创建,但我不知道我做错了什么。
编辑:所以我想办法让它发挥作用。。。将最后一个内部循环更改为:
$newNode = array(
'name' => $name,
'children' => array(),
);
$node['children'][] = $newNode;
$node =& $newNode;
到
$children =& $node['children'];
$children[] = array(
'name' => $name,
'children' => array()
);
$node =& $children[count($children)-1];
似乎是这样,但我不知道为什么。应该有一个很好的解释。