首页 » PHP教程 » 递归分页php技巧_递归在多级数据结构中的简单应用

递归分页php技巧_递归在多级数据结构中的简单应用

访客 2024-12-15 0

扫一扫用手机浏览

文章目录 [+]

哈喽,我是小码,半年多没更新了,这段韶光换了新事情,事情也很忙。
后续会只管即便多写点,坚持确实是一件很难,很酷的事情。
最近在公司卖力开拓商品有关的开拓,商品包含类型、格局等属性,而类型可能有一级类型、二级类型乃至是三级类型,针对这种多级分类,这就就不好利用大略的查询了。
之前也写了一篇文章,Java递归实现评论多级回答,写的比较大略。
本文做一些更加系统、完善的方案。

递归分页php技巧_递归在多级数据结构中的简单应用

多级数据构造的场景

多级数据在电商或者后台管理系统中是比较常见,比如博客或者短视频的评论,职员系统的多级部门等等,

递归分页php技巧_递归在多级数据结构中的简单应用
(图片来自网络侵删)
评论系统

A 写了一条评论,B 就可以回答 A 评论,C 又可以回答 B.

评论A├── 评论B,回答A│ └── 评论C,回答B└── 评论D,回答A职员系统

一样平常职员都是绑定一个企业和部门,企业有分公司,部门会多级部门。
每个人员绑定一个部门.

选择部门之后就可以获取对应的职员列表信息。

商品的多级分类

商品的类型,会细分多个类型,有一级分类,二级分类,或者有多级分类,比如黄金,分成黄金佳构,黄金佳构又分成手镯、项链。
手镯又分成固口手镯、开口手镯、卡扣手镯等等。

多级构造办理方案

像这种类似于树形构造的数据,数据一样平常都会包含id、parent_id、name等字段,通过id和parent_id来关联数据。
下面是一个大略的实体:

public class Multistage { public Multistage(Integer id,Integer parentId,String message) { this.id = id; this.parentId = parentId; this.message = message; } / id / private Integer id; / 父类id / private Integer parentId; / 名称 / private String name; // 省略get、set}

数据表和上面的实体类似。

1、展示多级接口

展示多级数据接口,就须要利用树的接口。
类似下面的接口:

public class ViewMultistage { / id / private Integer id; / 父类id / private Integer parentId; / 名称 / private String name; / 子集 / private List<ViewMultistage> children = new ArrayList<>();}

上面的几个例子,评论、部门、以及商品的分类,都是须要展示所有数据,以是须要从数据库获取所有数据,再利用代码归类。

针对这种多级、不愿定层级数量的,一样平常都利用递归方法获取。
从数据库获取到列表数据,利用递归办法转换:

// 数据库获取数据List<Multistage> multistageList = "select from t_xxxx";// 树形结果ViewMultistage root = new ViewMultistage();// 添加首节点root.setId(-1);// 递归添加add(root,multistageList);// 结果List<ViewMultistage> viewMultistageList = root.getChildren();System.out.println(viewMultistageList);// 递归添加数据private void add(ViewMultistage rootViewMultistage, List<Multistage> multistageList) { for (Multistage multistage : multistageList) { if (rootViewMultistage.getId().equals(multistage.getParentId())) { ViewMultistage viewMultistage = new ViewMultistage(); BeanUtils.copyProperties(multistage, viewMultistage); rootViewMultistage.getChildren().add(viewMultistage); add(viewMultistage, multistageList); } }}

简单阐明一下代码:

获取数据列表,创建树形类。
创建 -1 的虚拟节点,添加到属树形类上。
利用递归不断找到子节点,直到遍历完所有数据。
虚拟节点的子节点 root.getChildren() 便是我们要的结果。

从数据库获取的数据一定要有顺序,子数据不能比父数据排前面。

查询子集数据

如果不是获取所有的数据,只是获取一部分的数据。
以部门和职员举例,部门有子部门,子部门有部门职员。
哀求查询部门以及子部门的职员信息。
商品绑定二级格局或者三级格局,但是须要通过一级格局找到对应的下级的商品。

办理问题的重点便是获取到「部门以及子部门的凑集」,这里就有两个方案。

获取所有部门,代码筛选

从数据获取所有的部门数据,遍历列表,筛选出符合条件的数据。
比如上面的华南部门,假设 id 为 3,通过如下代码就能获取到部门 id 凑集:

Integer id = 3;Set<Integer> idSet = new HashSet<>();idSet.add(id);for (ViewMultistage multistage : viewMultistageList) { Integer parentId = multistage.getParentId(); if (idSet.contains(parentId)) { idSet.add(multistage.getId()); }}

通过某个 id 就可以筛选部门以及子部门的凑集,然后通过部门 id 的凑集就能获取到职员信息。

但是如果只是获取一小部门的子集,却要获取全部数据,有点摧残浪费蹂躏查询资源。
可以在数据库中刷选好数据,通过数据库递归获取数据。

通过数据库递归查找

查询数据大部分时候还是须要查询数据库,通过数据库一步到位,也减少了代码的的书写。
将递归的查询办法转移到数据库中,利用到了 Mysql 递归函数 with recursive,用法如下:

WITH RECURSIVE family_tree AS ( -- 根本查询:从给定的一级 id 开始 SELECT id, parent_id FROM parents WHERE id = 1 -- 更换为你要查询的一级 id UNION ALL -- 递归查询:查找子节点 SELECT p.id, p.parent_id FROM parents p INNER JOIN family_tree ft ON p.parent_id = ft.id)select tu. from family_tree ftleft join t_user tu on tu.dept_id = ft.id

剖析with recursive用法:

WITH RECURSIVE family_tree AS 是一个固定用法,将 () 查询的数据结果返回给 family_tree。
函数体里面包含两部分,起始值和循环值起始值:确认首节点的位置,上面例子以 id = 1作为起始值。
循环值:以 id = 1 找到 parent_id 为 1 的数据,假设这个 id 为 2,然后找到 parent_id 的数据,一贯循环查找,直到查询结束。
上面的 family_tree 就类似通过父部门获取到所有的子部门,利用用户表关联,就能获取所有部门以及子部门的用户信息。
总结

多级数据构造在项目开拓中是一种比较常见的数据构造,比如:

评论,评论回答评论,其他评论再回答评论。
企业部门,部门有子部门,或者公司有子公司。
商品分类有一级分类,二级分类。

多级数据构造须要办理两个问题,一个是查询所有数据,其余一个是查询部分数据,这两个都须要利用到递归的查询。

查询所有数据比较少的数据,就可以查询所有的数据,从数据库查询到以是数据,按照添加韶光的先后排序,再利用递归的办法将数据组装成一个树形构造。
如果是评论的数据,就须要存储评论的等级,先分页获取一级的评论,再通过一级评论获取下级评论。
查询部分数据通过某个一级部门获取所有的子部门,有两种办法,第一种是获取所有的部门数据,再循环遍历数据,将符合的数据放到一个凑集中。
第二种是利用 Mysql 递归,利用with recursive 先确定一个起始值,在不断的遍历下级部门。

标签:

相关文章

双城大数据,驱动未来城市发展的核心引擎

随着科技的飞速发展,大数据已成为推动各行各业变革的重要力量。在城市化进程不断加快的今天,双城大数据成为驱动未来城市发展的核心引擎。...

PHP教程 2024-12-17 阅读0 评论0

叶子大数据,绿色发展的新引擎

随着我国经济的快速发展,环境保护问题日益凸显。近年来,大数据技术在各个领域的应用越来越广泛,为我国绿色发展提供了新的动力。其中,叶...

PHP教程 2024-12-17 阅读0 评论0

合江大数据,赋能新时代,构建智慧未来

随着信息技术的飞速发展,大数据已成为推动经济社会发展的核心动力。合江作为我国大数据产业的重要基地,近年来在大数据领域取得了显著成果...

PHP教程 2024-12-17 阅读0 评论0

吉骐大数据,引领未来数据时代的创新力量

随着互联网的飞速发展,大数据已经成为当今社会的重要资源。在众多大数据企业中,吉骐大数据凭借其先进的技术和丰富的实践经验,成为引领未...

PHP教程 2024-12-17 阅读0 评论0

吉山大数据,驱动未来发展的智慧引擎

随着科技的飞速发展,大数据已经成为当今世界的重要驱动力。吉山大数据作为我国大数据领域的一颗璀璨明珠,以其独特的技术优势和创新应用,...

PHP教程 2024-12-17 阅读0 评论0

启晨大数据,引领未来,开启智能新时代

随着科技的飞速发展,大数据已经逐渐成为推动社会进步的重要力量。在我国,启晨大数据作为行业领军者,凭借其先进的技术和丰富的实践经验,...

PHP教程 2024-12-17 阅读0 评论0