首页  >  文章  >  数据库  >  如何使用 PHP 和 MySQL 查询结果检索父节点下的所有子节点、孙节点和后代节点?

如何使用 PHP 和 MySQL 查询结果检索父节点下的所有子节点、孙节点和后代节点?

Susan Sarandon
Susan Sarandon原创
2024-11-09 01:35:02866浏览

How do I retrieve all child, grandchild, and descendant nodes under a parent node using PHP with MySQL query results?

使用 PHP 和 MySQL 查询结果获取父级下的所有子节点、孙节点等

原始问题:

检索与父节点关联的所有子节点、孙节点和后续后代节点是使用分层数据结构时的一项常见任务。这个问题出现在数据库表采用邻接表模型进行数据组织的场景中。

使用递归的方法:

为了解决这个问题,递归被证明是一种有效的方法方法。以下是如何使用递归来实现此目标的详细说明:

1.建立基本函数:

递归函数是一种调用自身来解决问题的函数,通常用于涉及分层或嵌套数据结构的场景。在本例中,我们的基函数将被命名为 fetch_recursive.

2。确定递归调用的标准:

在 fetch_recursive 中,两个主要条件决定何时进行递归调用:

  • 找到父节点:当当前正在评估的节点是我们感兴趣的父节点(基于提供的 ID)。
  • 找到子节点:当当前节点具有与父节点 ID 匹配的父节点时.

3.构造结果数组:

每次进行递归调用时,该函数都会使用当前节点的相关数据填充结果数组。随着递归调用遍历树结构,该数组将迭代增长。

4.递归搜索子节点:

如果当前节点有任何子节点(通过children属性的存在来标识),将进行另一个递归调用来检索这些子节点。此过程持续进行,直到捕获父节点的所有子节点。

附加功能:

1。处理孙子和后代:

fetch_recursive 的递归性质确保它会自动遍历层次结构,不仅检索子节点,还检索孙子和后续后代。

2 。统一结果:

所有递归调用完成后,函数返回一个完整的数组,其中包含指定父节点下的所有后代节点。

代码实现:

function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
    foreach($src_arr as $row)
    {
        if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                $rowdata[$k] = $v;
            $cats[] = $rowdata;
            if($row['parent_id'] == $currentid)
                $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
        }
    }
    return $cats;
}

用法:

要使用 fetch_recursive 函数,只需传递原始数据数组(在本例中为 $data)和要从中检索后代的节点的 ID。例如,要检索节点 3 下的所有子节点、孙节点和后代节点:

function fetch_recursive($src_arr, $currentid, $parentfound = false, $cats = array())
{
    foreach($src_arr as $row)
    {
        if((!$parentfound && $row['id'] == $currentid) || $row['parent_id'] == $currentid)
        {
            $rowdata = array();
            foreach($row as $k => $v)
                $rowdata[$k] = $v;
            $cats[] = $rowdata;
            if($row['parent_id'] == $currentid)
                $cats = array_merge($cats, fetch_recursive($src_arr, $row['id'], true));
        }
    }
    return $cats;
}

这将使用包含所有相关节点的数组填充 $list 变量。

以上是如何使用 PHP 和 MySQL 查询结果检索父节点下的所有子节点、孙节点和后代节点?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn