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 相关文章推荐
apache+mysql+php+ssl服务器之完全安装攻略
Sep 05 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
获取URL文件名后缀
Oct 24 PHP
PHP数据过滤的方法
Oct 30 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
php利用腾讯ip分享计划获取地理位置示例分享
Jan 20 PHP
设置php页面编码的两种方法示例介绍
Mar 03 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
php计算数组相同值出现次数的代码(array_count_values)
Jan 20 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
laravel清除视图缓存的代码
Oct 23 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
基于jQuery制作小图标上下滑动特效
2017/01/18 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
vue 递归组件的简单使用示例
2021/01/14 Vue.js
[01:44]《为梦想出发》—联想杯DOTA2完美世界全国高校联赛
2015/09/30 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
Python实现学生成绩管理系统
2020/04/05 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
详解Django配置优化方法
2019/11/18 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
自我评价优秀范文分享
2013/11/30 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
委托书的写法
2014/08/30 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
公司委托书范本5篇
2014/09/20 职场文书
运动会广播稿200字
2014/10/18 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis