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 相关文章推荐
PHP4(windows版本)中的COM函数
Oct 09 PHP
图书管理程序(一)
Oct 09 PHP
一个简易需要注册的留言版程序
Oct 09 PHP
基于php使用memcache存储session的详解
Jun 25 PHP
php ci框架中加载css和js文件失败的解决方法
Mar 03 PHP
win平台安装配置Nginx+php+mysql 环境
Jan 12 PHP
详解php框架Yaf路由重写
Jun 20 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
php中数组最简单的使用方法
Dec 27 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资源管理框架Assetic简介
2014/06/12 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
python面向对象法实现图书管理系统
2019/04/19 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
Python实现时间序列可视化的方法
2019/08/06 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
python属于软件吗
2020/06/18 Python
师范学院毕业生求职信范文
2013/12/26 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
年会搞笑主持词
2014/03/27 职场文书
校庆活动方案
2014/03/31 职场文书
学生操行评语大全
2014/04/24 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
道歉信怎么写
2015/05/12 职场文书
加薪申请报告范本
2015/05/15 职场文书
借钱欠条怎么写
2015/07/03 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
全新239军机修复记
2022/04/05 无线电