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 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
PHP 采集程序中常用的函数
Dec 09 PHP
php引用地址改变变量值的问题
Mar 23 PHP
使用PHP编写的SVN类
Jul 18 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 PHP
浅析PHP echo 和 print 语句
Jun 30 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来处理多个提交任务
2006/10/09 PHP
php 动态多文件上传
2009/01/18 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
扩展String功能方法
2006/09/22 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
jQuery+pjax简单示例汇总
2017/04/21 jQuery
js 两数组去除重复数值的实例
2017/12/06 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
python绘制中国大陆人口热力图
2018/11/07 Python
Python中extend和append的区别讲解
2019/01/24 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
2014年高考决心书
2014/03/11 职场文书
事业单位个人总结
2015/02/12 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
毕业证明书
2015/06/19 职场文书
python requests模块的使用示例
2021/04/07 Python
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers