PHP:文件系统扩展

vsdwdz23  于 2023-03-16  发布在  PHP
关注(0)|答案(4)|浏览(133)

我有一个函数可以从我的数据库中获取父节点的所有子节点的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。

0lvr5msh

0lvr5msh1#

这对我来说很好:

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);,然后它将返回给定节点/父节点的完整子节点数组。

6za6bjd0

6za6bjd02#

嵌套集模型代替邻接列表模型

我是否可以建议您将节点存储在NSM而不是ALM下的数据库中?
注意,使用ALM(这是您正在使用的)获取子节点是相当困难的,这是可能的,但需要额外的工作。如果您使用嵌套集合模型,选择一个子节点或所有节点,甚至查找所有节点的深度都可以在单个SQL查询中完成。
我希望这能为你如何解决你的问题提供一些启示,如果你还年轻,在你的项目发展现在切换将保存你很多头痛以后。

axr492tv

axr492tv3#

不要使用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;
}
nfg76nw0

nfg76nw04#

我可以向你推荐这个版本的作品:

public function getDescendants($id){
    $sth = $this->db->prepare(
        "YOUR SQL"
    );
    $sth->execute([$id]);
    $descendants = $sth->fetchAll(PDO::FETCH_ASSOC);

    // Recursively repeat the query for each id
    return array_reduce($descendants, function($carried_array, $father){
        // Spread operator to merge arrays [...carried_array, father, ...descendants]
        return [...$carried_array, $father, ...$this->getDescendants($father['id'])];
    }, []);
}

相关问题