PHP使用递归按层级查找数据的方法


Posted in PHP onNovember 10, 2019

今天主要介绍一下使用递归来按层级查找数据。

原理挺简单的,主要是通过父级id一级一级的循环查找子级,使用PHP循环代码也很容易实现,不过如果层级越多,PHP重复代码也越多,这时可以使用递归来实现这功能。

1、首先查出要使用的数据组成一个数组(避免递归里查询数据库,之后根据这个数组组成自己需要的数据就可以了)
比如得到如下数据:

$data = [
 ['id' => '1', 'pid' => '0', 'dsp' => '1'],
 ['id' => '2', 'pid' => '0', 'dsp' => '2'],
 ['id' => '3', 'pid' => '0', 'dsp' => '3'],
 ['id' => '4', 'pid' => '1', 'dsp' => '1-4'],
 ['id' => '5', 'pid' => '4', 'dsp' => '1-4-5'],
 ['id' => '6', 'pid' => '5', 'dsp' => '1-4-5-6'],
 ['id' => '7', 'pid' => '3', 'dsp' => '3-7'],
 ['id' => '8', 'pid' => '2', 'dsp' => '2-8'],
 ['id' => '9', 'pid' => '1', 'dsp' => '1-9'],
 ['id' => '10', 'pid' => '4', 'dsp' => '1-4-10'],
];

2、接下来使用递归重组数据,使数据按层级显示。

/**
 * 根据父级id查找子级数据
 * @param $data  要查询的数据
 * @param int $pid 父级id
 */
public function recursion($data, $pid = 0)
{
 static $child = []; // 定义存储子级数据数组
 foreach ($data as $key => $value) {
  if ($value['pid'] == $pid) {
   $child[] = $value; // 满足条件的数据添加进child数组
   unset($data[$key]); // 使用过后可以销毁
   $this->recursion($data, $value['id']); // 递归调用,查找当前数据的子级
  }
 }
 return $child;
}

得到结果:

[
 {
 "id": "1",
 "pid": "0",
 "dsp": "1"
 },
 {
 "id": "4",
 "pid": "1",
 "dsp": "1-4"
 },
 {
 "id": "5",
 "pid": "4",
 "dsp": "1-4-5"
 },
 {
 "id": "6",
 "pid": "5",
 "dsp": "1-4-5-6"
 },
 {
 "id": "10",
 "pid": "4",
 "dsp": "1-4-10"
 },
 {
 "id": "9",
 "pid": "1",
 "dsp": "1-9"
 },
 {
 "id": "2",
 "pid": "0",
 "dsp": "2"
 },
 {
 "id": "8",
 "pid": "2",
 "dsp": "2-8"
 },
 {
 "id": "3",
 "pid": "0",
 "dsp": "3"
 },
 {
 "id": "7",
 "pid": "3",
 "dsp": "3-7"
 }
]

总结

以上所述是小编给大家介绍的PHP使用递归按层级查找数据的方法,希望对大家有所帮助!

PHP 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
php 什么是PEAR?
Mar 19 PHP
PHP的单引号和双引号 字符串效率
May 27 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 PHP
PHP中常用的魔术方法
Apr 28 PHP
PHP实现的激活用户注册验证邮箱功能示例
Jun 06 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 #PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 #PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 #PHP
PHP多进程简单实例小结
Nov 09 #PHP
PHPUnit + Laravel单元测试常用技能
Nov 06 #PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 #PHP
基于thinkphp6.0的success、error实现方法
Nov 05 #PHP
You might like
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
php实现图片缩放功能类
2013/12/18 PHP
php递归json类实例
2014/12/02 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php实现表单提交上传文件功能
2018/05/28 PHP
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
Python如何生成xml文件
2020/06/04 Python
英国创新设计文具、卡片和礼品包装网站:Paperchase
2018/07/14 全球购物
PHP如何自定义函数
2016/09/16 面试题
技校教师求职简历的自我评价
2013/10/20 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
会计毕业自我鉴定
2014/02/05 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
品牌宣传方案
2014/03/21 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
用人单位聘用意向书
2015/05/11 职场文书
单位综合评价意见
2015/06/05 职场文书