php生成树状层级子孙树-迭代篇
关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了。
以下是迭代的代码实现
<?php
$data = [
['id' => 1, 'name' => '中国', 'pid' => 0],
['id' => 2, 'name' => '江苏', 'pid' => 1],
['id' => 6, 'name' => '工业园区', 'pid' => 5],
['id' => 7, 'name' => '中新大道', 'pid' => 6],
['id' => 9, 'name' => '鄞州区', 'pid' => 4],
['id' => 3, 'name' => '浙江', 'pid' => 1],
['id' => 10, 'name' => '天童南路', 'pid' => 8],
['id' => 8, 'name' => '首南街道', 'pid' => 9],
['id' => 4, 'name' => '宁波', 'pid' => 3],
['id' => 5, 'name' => '苏州', 'pid' => 2],
['id' => 11, 'name' => '北京', 'pid' => 1],
['id' => 12, 'name' => '海淀', 'pid' => 11],
]; function getTree($data = [], $parent = 0)
{
$target_list = [$parent];
$tree = [];
$level = 0;
while (!empty($target_list)) {
$flag = false;
foreach ($data as $key => $value) {
if ($value['pid'] == $parent) {
$level++;
$value['level'] = $level;
$tree[] = $value;
$target_list[] = $parent = $value['id'];
unset($data[$key]);
$flag = true;
}
}
if (!$flag) {
$level--;
array_pop($target_list);
$parent = end($target_list);
}
}
return $tree;
} $list = getTree($data, 0); foreach ($list as $v) {
$level = isset($v['level']) ? $v['level'] : 0;
echo str_repeat(' ', $level - 1) . $v['name'] . "\r\n";
}
输出结果如下:

这里我特意把传递的数据打乱顺序,看看它能不能获取到正确的顺序层级,这样一看也没问题。
这个迭代的核心思想是用target_list去存储当前要找的那个父级,找到了就追加进去,层级++,找不到就弹出来一个,层级--
可以看一下以前我写递归的方式,递归就很好理解,但是自己心里面就是感觉效率上和安全上面差点意思,代码如下:

用数据库的数据算了一下效率,其实差不多,没有很明显的差距,当数据量只有几条的时候迭代比递归甚至还慢一点,当数据量有四千多条的时候(省市县三级数据)迭代比递归稍微快一点点,但是真的不明显。
看来这里还需要一个更强更好的算法来解决该问题啊!
php生成树状层级子孙树-迭代篇的更多相关文章
- js list数据 转 树状 层级 JSON,递归生成树状 层级 JSON
<!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...
- json list数据递归生成树状层级JSON
<!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...
- 原创的基于HTML/CSS/JavaScript的层级目录树
之前参加过一些基于HTML/CSS/JavaScript的项目,当在页面中需要生成一颗目录树时,总是首先想着网上有没有现成的生成树的源代码,比如dtree.zthee,或者使用一些javascript ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1 5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...
- 【BZOJ-1452】Count 树状数组 套 树状数组
1452: [JSOI2009]Count Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1769 Solved: 1059[Submit][Stat ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- zoj2112 树状数组+主席树 区间动第k大
Dynamic Rankings Time Limit: 10000MS Memory Limit: 32768KB 64bit IO Format: %lld & %llu Subm ...
- BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- 无限极分类php实现—查子孙树、家谱树
1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...
随机推荐
- Python中的分布式框架Ray的安装与使用
技术背景 假设我们在一个局域网内有多台工作站(不是服务器),那么有没有一个简单的方案可以实现一个小集群,提交分布式的任务呢?Ray为我们提供了一个很好的解决方案,允许你通过conda和Python灵活 ...
- Android Adapter中组件EditText文本变化监听 addTextChangedListener
问题背景:使用适配器显示一个列表,列表中Item中有EditText,滚动时会有EditText组件内容消失 步骤: 1. 在Adapter中,添加interface public interface ...
- RabbitMQ核心概念以及工作原理【转】
RabbitMQ核心概念以及工作原理 我们来看看流行的RabbitMQ消息系统以及它是如何让你的系统之间进行解耦的. 英文原文 RabbitMQ 在这篇短文里,我们会介绍什么是RabbitMQ,它 ...
- 【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出
[问题分类]功能使用 [关键字]数据库审计,shutdown immediate [问题描述]审计shutdown immediate 操作,数据库作主从切换时会导致数据库异常退出. [问题原因分析] ...
- web 3d 技术预研及数据可视化技术
web 3D 技术 白纸一张,先理一理概念: webGL 是low level 库,three.js 是high level 库,一般只要理解webGL里的概念,实际用thee.js 开发更容易 3D ...
- 支付宝小程序swiper video的坑
在使用uniapp 开发多端应用的时候,踩了一个坑,有一个页面,是使用swiper作为滑动容器,然后每个swiper-item 嵌套不同的内容, 代码示意: <template> < ...
- react 中获取子组件
wrappedComponentRef={(form) => this.table = form}
- keras各种问题
还是不熟悉造成的,keras的各种包使用起来真是有点小麻烦.导入方式不同就容易引起错误,也不提示你导入的库不存在,但是就是调用的时候报错. 比如近期写文章想画模型图,plot_model模块导入出问题 ...
- AI工具合集
以下工具来源于互联网,可能会失效,请参考使用 网红工具 名称 链接 说明 GPT-4 https://chat.openai.com/ 需要梯子,需要付费.功能最强大的聊天机 器人. 文心一言 h ...
- Angular Material 18+ 高级教程 – Datepicker の Calendar & Custom DateAdapter (Temporal)
前言 本篇只会教 Angular Material Datepicker 里最关键的组件 -- Calendar 组件. 还有如何自定义 DateAdapter,让 Calendar 支持 TC39 ...