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一次只能创建一层目录,而 ...
随机推荐
- 5、Docker 核心原理-资源隔离和限制
Docker 资源隔离 Docker 是利用linux的LXC技术,内核的Kernel namespace Namespace: PID - 通过PID的namespace隔离,可以嵌套 NET - ...
- 跨平台c开发库tbox:内存库使用详解
TBOX是一个用c语言实现的跨平台开发库. 针对各个平台,封装了统一的接口,简化了各类开发过程中常用操作,使你在开发过程中,更加关注实际应用的开发,而不是把时间浪费在琐碎的接口兼容性上面,并且充分利用 ...
- 使用 SecureRandom 产生随机数采坑记录
公众号「码海」欢迎关注 背景 我们的项目工程里经常在每个函数需要用到 Random 的地方定义一下 Random 变量(如下) public void doSomethingCommon() { Ra ...
- XML与JSON解析
[XML简介] XML在线校验工具: http://tool.oschina.net/codeformat/xml 可扩展标记语言(EXtensible Markup Language) 一种标记语言 ...
- 关于<form> autocomplete 属性
基本知识 值 描述 on 默认.规定启用自动完成功能. off 规定禁用自动完成功能. autocomplete 属性规定表单是否应该启用自动完成功能. 自动完成允许浏览器预测对字段的输入.当用户在字 ...
- MVC效验器
步骤一:导入依赖 <!--数据效验--> <dependency> <groupId>org.hibernate</groupId> <artif ...
- python获取bing地图发布自己的TMS服务(一)下载瓦片
部分结果 bing地图瓦片使用QuadKey作为命名方式. QuadKey简介 如何计算quadkey 在给定level下,把行号tileY和列号tileX转换为2进制,然后行列交叉存储,再转换为4进 ...
- CoderForces Round526 (A~E)题解
A. The Fair Nut and Elevator time limit per test 1 second memory limit per test 256 megabytes input ...
- eviews面板数据的操作
数据结构: 打开eviews File>new>workfile Object>new object > pool 输入城市名称: _bj 下划线加名称(必须是英文),竖着输入 ...
- django学习02-模型的使用
新手做的笔记,很可能会有理解错误的地方.欢迎拍砖. mysite/settings.py的INSTALLED_APPS选项中定义了几个默认的app,又如django.contrib.admin,dja ...