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 cookie 登录验证示例代码
Mar 16 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
phpcms手机内容页面添加上一篇和下一篇
Jun 05 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
Jun 19 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
Sep 23 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 PHP
PHP如何解决微信文章图片防盗链
Dec 09 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
德生PL990的分析评价
2021/03/02 无线电
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
JSON相关知识汇总
2015/07/03 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
2020/07/24 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python线程详解
2015/06/24 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python argv用法详解
2016/01/08 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
医生进修自我鉴定
2014/01/19 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
文明单位汇报材料
2014/12/24 职场文书
民主评议党员个人总结
2015/02/13 职场文书
开国大典观后感
2015/06/04 职场文书
详解Vue router路由
2021/11/20 Vue.js