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 相关文章推荐
PHP5+UTF8多文件上传类
Oct 17 PHP
PHP 上传文件大小限制
Jul 05 PHP
Window下PHP三种运行方式图文详解
Jun 11 PHP
PHP根据IP判断地区名信息的示例代码
Mar 03 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
php实现批量修改文件名称的方法
Jul 23 PHP
PHP二分查找算法示例【递归与非递归方法】
Sep 29 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
利用php生成验证码
Feb 23 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
PHP优化之批量操作MySQL实例分析
Apr 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和ACCESS写聊天室(十)
2006/10/09 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
短信提示使用 特效
2007/01/19 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
AngularJS 模型详细介绍及实例代码
2016/07/27 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
JS设计模式之惰性模式(二)
2017/09/29 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
浅述python中深浅拷贝原理
2018/09/18 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
Python如何安装第三方模块
2020/05/28 Python
Keras实现DenseNet结构操作
2020/07/06 Python
Python实现自动签到脚本功能
2020/08/20 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
个人实习生的自我评价
2014/02/16 职场文书
合作意向协议书范本
2014/03/31 职场文书
空气环保标语
2014/06/12 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
爱心助学感谢信
2015/01/21 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
会计主管竞聘书
2015/09/15 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS