我有一个函数可以从我的数据库中获取父节点的所有子节点的id,所以如果我查找id 7,它可能会返回一个包含5,6和10的数组,然后我想做的是递归地找到这些返回id的子节点,依此类推,直到子节点的最终深度。
我试着写一个函数来做这件事,但是我对递归感到困惑。
function getChildren($parent_id) {
$tree = Array();
$tree_string;
if (!empty($parent_id)) {
// getOneLevel() returns a one-dimentional array of child ids
$tree = $this->getOneLevel($parent_id);
foreach ($tree as $key => $val) {
$ids = $this->getChildren($val);
array_push($tree, $ids);
//$tree[] = $this->getChildren($val);
$tree_string .= implode(',', $tree);
}
return $tree_string;
} else {
return $tree;
}
}//end getChildren()
在函数运行之后,我希望它返回一个一维数组,其中包含找到的所有子ID。
4条答案
按热度按时间0lvr5msh1#
这对我来说很好:
调用
getChildren(yourid);
,然后它将返回给定节点/父节点的完整子节点数组。6za6bjd02#
嵌套集模型代替邻接列表模型
我是否可以建议您将节点存储在NSM而不是ALM下的数据库中?
注意,使用ALM(这是您正在使用的)获取子节点是相当困难的,这是可能的,但需要额外的工作。如果您使用嵌套集合模型,选择一个子节点或所有节点,甚至查找所有节点的深度都可以在单个SQL查询中完成。
我希望这能为你如何解决你的问题提供一些启示,如果你还年轻,在你的项目发展现在切换将保存你很多头痛以后。
axr492tv3#
不要使用
array_push($tree, $ids);
,尝试$tree = array_merge($tree, $ids);
。杀死$tree_string .= implode(',', $tree);
,只杀死return $tree
。(一次)nfg76nw04#
我可以向你推荐这个版本的作品: