PHP使用递归按层级查找数据
今天主要介绍一下使用递归来按层级查找数据。
原理挺简单的,主要是通过父级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"
}
]
3、还可以使用下面的方法,显示更有层次感。
/**
* 根据父级id查找子级数据
* @param $data 要查询的数据
* @param int $pid 父级id
*/
public function recursion($data, $pid = 0)
{
$child = []; // 定义存储子级数据数组
foreach ($data as $key => $value) {
if ($value['pid'] == $pid) {
unset($data[$key]); // 使用过后可以销毁
$value['child'] = $this->recursion($data, $value['id']); // 递归调用,查找当前数据的子级
$child[] = $value; // 把子级数据添加进数组
}
}
return $child;
}
得到结果:
[
{
"id": "1",
"pid": "0",
"dsp": "1",
"child": [
{
"id": "4",
"pid": "1",
"dsp": "1-4",
"child": [
{
"id": "5",
"pid": "4",
"dsp": "1-4-5",
"child": [
{
"id": "6",
"pid": "5",
"dsp": "1-4-5-6",
"child": []
}
]
},
{
"id": "10",
"pid": "4",
"dsp": "1-4-10",
"child": []
}
]
},
{
"id": "9",
"pid": "1",
"dsp": "1-9",
"child": []
}
]
},
{
"id": "2",
"pid": "0",
"dsp": "2",
"child": [
{
"id": "8",
"pid": "2",
"dsp": "2-8",
"child": []
}
]
},
{
"id": "3",
"pid": "0",
"dsp": "3",
"child": [
{
"id": "7",
"pid": "3",
"dsp": "3-7",
"child": []
}
]
}
]
PHP使用递归按层级查找数据的更多相关文章
- 【吐血分享】SQL Server With As 递归获取层级关系数据
纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ...
- SQL Server 利用WITH AS递归获取层级关系数据
WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性 ...
- 【微信小程序】 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded
摘要: 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded 场景:最近做一个车贷计算器, 其中存在一个公式如下: /**** 总金额 * 月利率 * ( ...
- 【C++】递归之二分查找
简单查找的时间复杂度为O(n) 二分查找的时间复杂度为O(logn) 用递归实现二分查找: 基线条件:数组只包含一个元素.如果如果要查找的值与这个元素相同,就找到了:否则说明不在数组中. 递归条件:把 ...
- 一个有趣的SQL Server 层级汇总数据问题
看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题. 具体的问题如下: parent_id emp_id emp_nam ...
- EF封装类 增加版,增加从缓存中查找数据方法,供参考!
EF封装类 增加版,增加从缓存中查找数据方法,供参考! 这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都 ...
- TreeView递归绑定无限分类数据
TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...
- JS数组2(冒泡排列、数组里面查找数据)
数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...
- 利用php函数mkdir递归创建层级目录
项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...
随机推荐
- C语言l-2019秋作业01
2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 在进入大学之前,我认为软件工程就是学习开发软件的,后来,从网上搜索了有关它的定义,软件工程是一门研究用工程化方法构建和维护软件的学科,它以 ...
- IDEA 自定义代码块
使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...
- redis与memcached区别
不同点: (1) redis中并不是所有数据在有效期内只能常驻内存的(如果需要,可定期同步持久化到磁盘),这是和memcached相比一个最大的区别(memcached中的数据在有效期内是以键值对的形 ...
- mysql那些事(6) WHERE条件 字符串的引号
前言:所谓的坑,两个意思,一个是软件本身的bug,一个是使用者常犯的错误. phper在日常开发中经常和mysql打交道.特别是在没有分层的中小应用中,phper开发要关注sql语句的实现. 入正题, ...
- 常用tab选项卡代码
<div class="box"> <ul> <li class="one">课程介绍</li> <li& ...
- PHP fsockopen受服务器KeepAlive影响的解决
在开发过程中常常遇到这样的需求,模拟浏览器访问某接口,并获取返回数据.我们比较常使用的方法是fsockopen与接口建立连接,然后发出指令,然后通过fgets接受返回值. 但是我们发现,通过PHP模拟 ...
- git 路上的拦路虎 了解一下
我们提交代码现在大部分都在用git 管理代码,有时候会遇到一些问题 用git 会发现一些问题 之前报了一些错误,没有记录,这次记录一下,顺便写一下解决方式: 输输入git remote add or ...
- MVC异常处理
处理局部异常 控制器: @Controller @RequestMapping("/ex") public class ExceptionController { @Excepti ...
- [TimLinux] django SELinux+httpd+mod_wsgi部署
1. 实验项目 $ django-admin startproject myweb $ cd myweb/ $ python manage.py startapp poll 1. 配置使用MySQL ...
- [TimLinux] openpyxl 操作Excel
from openpyxl import Workbook from openpyxl.styles import Color, PatternFill, Font from openpyxl.sty ...