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 相关文章推荐
基于mysql的论坛(3)
Oct 09 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
php中AES加密解密的例子小结
Feb 18 PHP
CodeIgniter框架过滤HTML危险代码
Jun 12 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
[原创]PHP简单开启curl的方法(测试可行)
Jan 11 PHP
php 数组字符串搜索array_search技巧
Jul 05 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
PHP crc32()函数讲解
Feb 14 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
UCenter中的一个可逆加密函数authcode函数代码
2010/07/20 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
2011/01/11 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
ECMAScript5中的对象存取器属性:getter和setter介绍
2014/12/08 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
JS中获取函数调用链所有参数的方法
2015/05/07 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
详解ES6中的let命令
2020/04/05 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
简述Python中的面向对象编程的概念
2015/04/27 Python
python中lambda与def用法对比实例分析
2015/04/30 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
python3实现弹弹球小游戏
2019/11/25 Python
python操作cfg配置文件方式
2019/12/22 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
2020/02/27 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
商务英语专业自荐信
2013/10/14 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
内业资料员岗位职责
2014/01/04 职场文书
创先争优活动方案
2014/02/12 职场文书