我有一个函数可以从我的数据库中获取父项的所有子项的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的一维数组。
答案 0 :(得分:6)
这对我来说很好:
function getOneLevel($catId){
$query=mysql_query("SELECT categoryId FROM categories WHERE categoryMasterId='".$catId."'");
$cat_id=array();
if(mysql_num_rows($query)>0){
while($result=mysql_fetch_assoc($query)){
$cat_id[]=$result['categoryId'];
}
}
return $cat_id;
}
function getChildren($parent_id, $tree_string=array()) {
$tree = array();
// getOneLevel() returns a one-dimensional array of child ids
$tree = $this->getOneLevel($parent_id);
if(count($tree)>0 && is_array($tree)){
$tree_string=array_merge($tree_string,$tree);
}
foreach ($tree as $key => $val) {
$this->getChildren($val, &$tree_string);
}
return $tree_string;
}
致电getChildren(yourid);
然后它将返回给定节点/父节点的完整子节点数组。
答案 1 :(得分:3)
我可以建议您将节点存储在NSM下的数据库而不是ALM中吗?
请注意,使用ALM(您正在使用的)获取子节点非常困难,但这可能,但需要额外的工作。如果使用嵌套集模型选择子节点或所有节点,甚至可以在单个SQL查询中查找所有节点的深度。
我希望这能说明你如何解决问题,如果你在项目开发过程中还很年轻,那么现在可以为你节省很多麻烦。
答案 2 :(得分:1)
而不是array_push($tree, $ids);
尝试$tree = array_merge($tree, $ids);
。杀死$tree_string .= implode(',', $tree);
和return $tree
。 (一次)
function getChildren($parent_id) {
$tree = Array();
if (!empty($parent_id)) {
$tree = $this->getOneLevel($parent_id);
foreach ($tree as $key => $val) {
$ids = $this->getChildren($val);
a$tree = array_merge($tree, $ids);
}
}
return $tree;
}