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
PHP的类 功能齐全的发送邮件类
Oct 09 PHP
PHP4 与 MySQL 数据库操作函数详解
Dec 06 PHP
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
preg_match_all使用心得分享
Jan 31 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
Oct 03 PHP
php数值计算num类简单操作示例
May 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
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
Python Socket编程入门教程
2014/07/11 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
python实现搜索本地文件信息写入文件的方法
2016/02/22 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python之列表实现栈的工作功能
2019/01/28 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
python使用smtplib模块发送邮件
2020/12/17 Python
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
初中成绩单评语
2014/12/29 职场文书
贷款担保书
2015/01/20 职场文书
家庭经济困难证明
2015/06/23 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
mysql 排序失效
2022/05/20 MySQL