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 相关文章推荐
打造计数器DIY三步曲(下)
Oct 09 PHP
PHP新手上路(十二)
Oct 09 PHP
php学习之运算符相关概念
Jun 09 PHP
PHP取进制余数函数代码
Jan 19 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
解析argc argv在php中的应用
Jun 24 PHP
php常用的url处理函数总结
Nov 19 PHP
PHP在线打包下载功能示例
Oct 15 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
PHP实现的curl批量请求操作示例
Jun 06 PHP
PHP按一定比例压缩图片的方法
Oct 12 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
50个PHP程序性能优化的方法
2014/06/02 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
Javascript实现的分页函数
2006/12/22 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
理解JS绑定事件
2016/01/19 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
jQuery操作事件完整实例分析
2020/01/10 jQuery
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
[00:27]DOTA2次级职业联赛 - Lilith战队宣传片
2014/12/01 DOTA
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python简单分割文件的方法
2015/07/30 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
Python如何发布程序的详细教程
2018/10/09 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
python数据预处理 :数据抽样解析
2020/02/24 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
基于OpenCV的网络实时视频流传输的实现
2020/11/15 Python
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
大学毕业生通用求职信
2013/09/28 职场文书
自我评价200字分享
2013/12/17 职场文书
留学推荐信中文范文三篇
2014/01/25 职场文书
自查自纠工作总结
2014/10/15 职场文书
幼儿教师辞职信
2015/02/27 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
设置IIS Express并发数
2022/07/07 Servers