ThinkPHP6实现递归树结构编程教程

2023-06-3008:22:25后端程序开发Comments1,145 views字数 1913阅读模式

网站和应用程序中都出现了树形结构的展示,例如分类目录、人员组织架构、权限管理等。在这些应用场景中,递归树结构已经成为了非常重要且实用的模型之一。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

ThinkPHP6是一种基于MVC模型的PHP开发框架,其拥有丰富的扩展库和优秀的性能,广受开发者的认可和使用,而在ThinkPHP6中实现递归树结构也变得更加方便了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

下面,我们将介绍如何在ThinkPHP6中使用递归函数来构建树形结构。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

一、定义数据库结构

在实现递归树结构之前,首先需要知道如何将数据存储在数据库中,以便于应用程序进行处理。在这个例子中,我们将创建一个“分类”表,在分类表中存储分类名称、分类ID、父级ID等信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

分类表结构如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

id int(11) 主键
name varchar(50) 分类名称
parent_id int(11) 父级分类ID文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

二、实现递归函数

接下来,我们需要实现一个递归函数,用于查询从根节点开始的所有子节点。在ThinkPHP6中,可以使用select方法结合$where参数来实现对指定列的查询,例如:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

Db::name('分类表')->where('parent_id',$id)->select();文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

在这个例子中,$id是传递给递归函数的参数,表示当前节点的ID。递归函数将根据该ID递归查询该节点的所有子节点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

下面是递归函数的实现:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

3文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

4文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

5文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

6文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

7文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

8文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

9文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

10文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

11文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

12文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

13文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

function getChildren($id){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    //查询该节点下的所有子节点文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    $children=Db::name('分类表')->where('parent_id',$id)->select();文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    //如果没有子节点,返回空数组文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    if(empty($children)){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        return $children;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    }文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    //递归查询子节点的子节点,并将结果合并到$children数组中文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    foreach($children as $k=>$v){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        $children[$k]['children']=$this->getChildren($v['id']);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    }文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    return $children;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

在这个函数中,我们首先查询该节点下的所有子节点,并将结果保存在$children数组中。如果该节点没有子节点,直接返回空数组。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

接下来,我们使用foreach循环遍历$children数组中的每个子节点,并调用递归函数来查询该子节点的所有子节点。将结果合并到$children数组中,最终返回整个$children数组。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

三、输出树形结构

当递归函数得到节点及其所有子节点的信息后,我们需要将它们输出为树形结构。这可以通过遍历递归函数返回的数组,并根据每个节点的深度输出相应的缩进符号来实现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

下面是输出树形结构的代码:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

3文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

4文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

5文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

6文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

7文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

8文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

9文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

10文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

11文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

12文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

13文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

14文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

15文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

16文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

function outputTree($arr,$deep=0){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    //定义缩进符号文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    $symbol='|--';文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    $html='';文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    foreach($arr as $v){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        //根据节点深度输出缩进符号文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        $html.=str_repeat('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',$deep).$symbol.$v['name'].'<br/>';文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        //如果有子节点,继续遍历文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        if(!empty($v['children'])){文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

            $html.=$this->outputTree($v['children'],$deep+1);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

        }文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    }文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

    return $html;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

}文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

在这个函数中,我们首先定义了缩进符号,然后递归遍历数组中的每个节点。根据当前节点的深度输出相应数量的缩进符号。如果一个节点有子节点,继续递归遍历该节点的所有子节点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

最后,输出整个树形结构的代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

1文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

3文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

4文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

$id=0;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

$arr=$this->getChildren($id);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

$html=$this->outputTree($arr);文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

echo $html;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

在这个代码中,$id表示根节点的ID,我们首先调用递归函数来获取所有子节点的信息,然后调用输出树形结构的函数,将整个树形结构输出到HTML页面中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

四、总结

通过使用ThinkPHP6的丰富扩展库和递归函数,我们可以轻松地构建递归树结构,使应用程序更加易于管理和使用。希望本文能够帮助到您构建树形结构时的开发工作,让您更加高效地完成任务。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48844.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/48844.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定