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 相关文章推荐
PHP实时显示输出
Oct 02 PHP
php+javascript的日历控件
Nov 19 PHP
PHP5中Cookie与 Session使用详解
Apr 30 PHP
PHP-Fcgi下PHP的执行时间设置方法
Aug 02 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
采用ThinkPHP中F方法实现快速缓存实例
Jun 13 PHP
php实现的支持imagemagick及gd库两种处理的缩略图生成类
Sep 23 PHP
PHP原生函数一定好吗?
Dec 08 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
session 加入redis的实现代码
Jul 15 PHP
详解PHP编码转换函数应用技巧
Oct 22 PHP
实现PHP中session存储及删除变量
Oct 15 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
php实现的RSS生成类实例
2015/04/23 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
vue-infinite-loading2.0 中文文档详解
2018/04/08 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
jQuery实现鼠标点击处心形漂浮的炫酷效果示例
2018/04/12 jQuery
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
简单谈谈python的反射机制
2016/06/28 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Django中更改默认数据库为mysql的方法示例
2018/12/05 Python
Python实现验证码识别
2020/06/15 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
HTML5触摸事件实现移动端简易进度条的实现方法
2018/05/04 HTML / CSS
StubHub德国:购买和出售门票
2017/09/06 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
个人课题方案
2014/05/08 职场文书
贷款担保申请书
2014/05/20 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript