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 相关文章推荐
PHP5 安装方法
Oct 09 PHP
如何在PHP中使用Oracle数据库(1)
Oct 09 PHP
PHP网站基础优化方法小结
Sep 29 PHP
用php实现百度网盘图片直链的代码分享
Nov 01 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 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
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python使用urllib2模块实现断点续传下载的方法
2015/06/17 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python实现局域网内实时通信代码
2019/12/22 Python
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
华为慧通笔试题
2016/04/22 面试题
中专生自我鉴定范文
2014/02/02 职场文书
酒店营销策划方案
2014/02/07 职场文书
大学生作弊检讨书
2014/02/19 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
音乐学专业求职信
2014/07/22 职场文书
工作推荐信模板
2015/03/25 职场文书
生日祝酒词大全
2015/08/10 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技