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+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
PHPMailer使用教程(PHPMailer发送邮件实例分析)
Dec 06 PHP
如何设置mysql允许外网访问
Jun 04 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
php单链表实现代码分享
Jul 04 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
Javascript Objects详解
2014/09/04 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
深入理解在JS中通过四种设置事件处理程序的方法
2017/03/02 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
举例详解Python中的split()函数的使用方法
2015/04/07 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python+selenium实现登录账户后自动点击的示例
2017/12/22 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python 获取等间隔的数组实例
2019/07/04 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
python处理document文档保留原样式
2019/09/23 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
python环境下安装opencv库的方法
2020/03/05 Python
python 基于opencv 绘制图像轮廓
2020/12/11 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
荷兰的时尚市场:To Be Dressed
2019/05/06 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
社区母亲节活动记录
2014/03/06 职场文书
消防验收申请报告
2015/05/15 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
Python djanjo之csrf防跨站攻击实验过程
2021/05/14 Python
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python