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读取数据库信息的几种方法
May 24 PHP
功能齐全的PHP发送邮件类代码附详细说明
Jul 10 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
Apr 25 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
php防止网站被刷新的方法汇总
Dec 01 PHP
php建立Ftp连接的方法
Mar 07 PHP
PHP Web木马扫描器代码分享
Sep 06 PHP
php模板引擎技术简单实现
Mar 15 PHP
PHP中的函数声明与使用详解
May 27 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
js实现无缝滚动双图切换效果
2019/07/09 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
python如何查看系统网络流量的信息
2016/09/12 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
优秀小学生家长评语
2014/01/30 职场文书
开会迟到检讨书
2014/02/03 职场文书
我的中国心演讲稿
2014/09/04 职场文书
邀请函范文
2015/02/02 职场文书
家长对学校的意见和建议
2015/06/03 职场文书