我正在尝试用线性路径构建嵌套树, 我所拥有的路径是从父母到孩子的分类,如下所示:
$paths= array(array(999, 10, 9, 8, 7), array(999, 10, 9, 82, 75), array(999, 10, 9, 83, 74));
其中10是999的孩子,9是10的孩子,8是9的孩子等。
tree_root有999个id,它将显示树的顶部节点。
$tree_root = array('id' => 999, 'nodes' => array());
我遇到的问题是buildTree
不会将持久的新子项添加到tree_root
中,插入只能在tree_root直接子项中使用,tree_root的子项中子项内的任何插入节点都将从buildTree函数返回后不存在,任何想法如何保留引用并解决这个问题?
// loop of sorted paths:
for ($i = 0; $i < count($paths); $i++) {
for ($l = 0; $l < count($paths[$i]) - 1; $l++) {
$this->buildTree($tree_root, $paths[$i][$l], $paths[$i][$l + 1]);
}
}
public function buildTree(&$a, $parent_id, $child_id)
{
if ($a["id"] == $parent_id) {
$exists = false;
for ($i = 0; $i < count($a["nodes"]); $i++) {
if ($a["nodes"][$i]["id"] == $child_id) {
$exists = true;
break;
}
}
if (!$exists) {
$node_template_children = array();
$node_template = array('id' => $child_id, 'nodes' => &$node_template_children);
$node_template = &$node_template;
$a_nodes = &$a["nodes"];
// $a_nodes is not affected when returning from buildTree!!
array_push($a_nodes, $node_template);
}
return true;
}
foreach ($a["nodes"] as $node) {
$result = $this->buildTree($node, $parent_id, $child_id);
if ($result == true) {
return true;
}
}
return false;
}