今天主要介绍一下使用递归来按层级查找数据。
原理挺简单的,主要是通过父级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使用递归按层级查找数据的更多相关文章

  1. 【吐血分享】SQL Server With As 递归获取层级关系数据

    纯洁的一周又开始了,今天看到一则新闻,笑尿了,和袁友们一起娱乐下 最近两月在做基于Saas模式的人力资源管理产品,平常数据库设计我经常会遇到如下需求场景: 以前商城类网站在设计类型表的时候,设计成单表 ...

  2. SQL Server 利用WITH AS递归获取层级关系数据

    WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性 ...

  3. 【微信小程序】 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded

    摘要: 小程序中的递归运算/二分查找算法/Maximum call stack size exceeded 场景:最近做一个车贷计算器, 其中存在一个公式如下: /**** 总金额 * 月利率 * ( ...

  4. 【C++】递归之二分查找

    简单查找的时间复杂度为O(n) 二分查找的时间复杂度为O(logn) 用递归实现二分查找: 基线条件:数组只包含一个元素.如果如果要查找的值与这个元素相同,就找到了:否则说明不在数组中. 递归条件:把 ...

  5. 一个有趣的SQL Server 层级汇总数据问题

        看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题.          具体的问题如下:     parent_id emp_id emp_nam ...

  6. EF封装类 增加版,增加从缓存中查找数据方法,供参考!

    EF封装类 增加版,增加从缓存中查找数据方法,供参考! 这个类是抽象类,我这里增加了需要子类验证的方法ValidateEntity,方便扩展,若想直接使用该类,可以将该类更改成静态类,里面所有的方法都 ...

  7. TreeView递归绑定无限分类数据

    TreeView递归绑定无限分类数据 实现一个动态绑定,无限级分类数据时,需要将数据绑定到TreeView控件,分类表的结构是这样的: 字段 类型 Id int ParentId int Name N ...

  8. JS数组2(冒泡排列、数组里面查找数据)

    数组 一.冒泡排列 对数组attr = [1,8,6,4,5,3,7,2,9]进行由大到小排列,用冒泡排列的方法排列时,会对数组进行比较互换.如果前一个数字较大,这2个元素排列方式不变,如果后一个元素 ...

  9. 利用php函数mkdir递归创建层级目录

    项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...

随机推荐

  1. 【Android - 问题解决】之Android Studio在Refreshing Gradle Project卡住的问题

    今天把Android Studio从2.2版本升级到了2.3版本,但是再打开以前项目的时候,就卡在 “Refreshing XXX Gradle Project” 这里不动了. 网上搜了一些解决方案, ...

  2. Docker 自建私有Registry 私有仓库

    目录 说明 介绍 原理 搭建 查看配置文件 启动 上传和下载镜像测试 测试上传镜像 测试下载镜像 说明 记录搭建 docker 私有仓库步骤 介绍 docker镜像可以托管到dockerhub中,跟代 ...

  3. Centos Linux下使用Metasploit渗透android

    .newline{display:block}.katex .base{position:relative;white-space:nowrap;width:min-content}.katex .b ...

  4. luogu P1712 [NOI2016]区间

    题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...

  5. TypeScript - 泛型

    什么是泛型 官方是这样介绍的: 软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性. 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵 ...

  6. Zabbix 监控PHP-FTPM、Tomcat、Redis应用

    一.zabbix 监控 PHP-FPM应用实战Nginx+PHP-FPM是目前最流行的LNMP架构,在基于PHP开发的系统下,对这些系统性能的监控,主要是关注PHP-FPM的运行状态,那么什么是PHP ...

  7. iCamera App Kit 使用说明

    一.概述 1.前言 iCamera是层层惊涛设计室推出的一款轻量级的摄像头开发调试工具,该工具可以用于市面上绝大多数摄像头的配置.调试.图像采集. iCamera主要作为摄像头开发调试工具,暂时不针对 ...

  8. 模拟摄像头解码模块最新测试 TVP5150模块 FPGA+SDRAM+TVP5150+VGA 实现PAL AV输入 VGA视频输出

    模拟摄像头解码模块最新测试  TVP5150模块  FPGA+SDRAM+TVP5150+VGA  实现PAL AV输入 VGA视频输出 测试使用电视机顶盒的AV模拟信号输入,VGA显示器输出测试,效 ...

  9. cookie、session和token那些事

    cookie 和 session 众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? 比如在淘宝的某个 ...

  10. 【重温基础】11.Map和Set对象

    本文是 重温基础 系列文章的第十一篇. 今日感受:注意身体,生病花钱又难受. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1.语法和数据类型 [重温基础]2 ...