关于简单的方式获取树状层级子孙树的方案我已经写过了,在这里,当时是用简单的递归实现的,但是现在回头想想,如果层级很多,数据也很多,用递归感觉还是会不稳妥,这就有必要想办法转换为迭代来实现了。

以下是迭代的代码实现

<?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生成树状层级子孙树-迭代篇的更多相关文章

  1. js list数据 转 树状 层级 JSON,递归生成树状 层级 JSON

    <!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...

  2. json list数据递归生成树状层级JSON

    <!DOCTYPE html> <html> <head> <script> var data=[ {"id":"aaa& ...

  3. 原创的基于HTML/CSS/JavaScript的层级目录树

    之前参加过一些基于HTML/CSS/JavaScript的项目,当在页面中需要生成一颗目录树时,总是首先想着网上有没有现成的生成树的源代码,比如dtree.zthee,或者使用一些javascript ...

  4. 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 ...

  5. 【BZOJ-1452】Count 树状数组 套 树状数组

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1769  Solved: 1059[Submit][Stat ...

  6. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  8. BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树

    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树 题意: 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i, ...

  9. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  10. 无限极分类php实现—查子孙树、家谱树

    1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...

随机推荐

  1. Python中的分布式框架Ray的安装与使用

    技术背景 假设我们在一个局域网内有多台工作站(不是服务器),那么有没有一个简单的方案可以实现一个小集群,提交分布式的任务呢?Ray为我们提供了一个很好的解决方案,允许你通过conda和Python灵活 ...

  2. Android Adapter中组件EditText文本变化监听 addTextChangedListener

    问题背景:使用适配器显示一个列表,列表中Item中有EditText,滚动时会有EditText组件内容消失 步骤: 1. 在Adapter中,添加interface public interface ...

  3. RabbitMQ核心概念以及工作原理【转】

    RabbitMQ核心概念以及工作原理 我们来看看流行的RabbitMQ消息系统以及它是如何让你的系统之间进行解耦的. 英文原文   RabbitMQ 在这篇短文里,我们会介绍什么是RabbitMQ,它 ...

  4. 【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出

    [问题分类]功能使用 [关键字]数据库审计,shutdown immediate [问题描述]审计shutdown immediate 操作,数据库作主从切换时会导致数据库异常退出. [问题原因分析] ...

  5. web 3d 技术预研及数据可视化技术

    web 3D 技术 白纸一张,先理一理概念: webGL 是low level 库,three.js 是high level 库,一般只要理解webGL里的概念,实际用thee.js 开发更容易 3D ...

  6. 支付宝小程序swiper video的坑

    在使用uniapp 开发多端应用的时候,踩了一个坑,有一个页面,是使用swiper作为滑动容器,然后每个swiper-item 嵌套不同的内容, 代码示意: <template> < ...

  7. react 中获取子组件

    wrappedComponentRef={(form) => this.table = form}

  8. keras各种问题

    还是不熟悉造成的,keras的各种包使用起来真是有点小麻烦.导入方式不同就容易引起错误,也不提示你导入的库不存在,但是就是调用的时候报错. 比如近期写文章想画模型图,plot_model模块导入出问题 ...

  9. AI工具合集

    以下工具来源于互联网,可能会失效,请参考使用 网红工具 名称 链接 说明   GPT-4 https://chat.openai.com/ 需要梯子,需要付费.功能最强大的聊天机 器人. 文心一言 h ...

  10. Angular Material 18+ 高级教程 – Datepicker の Calendar & Custom DateAdapter (Temporal)

    前言 本篇只会教 Angular Material Datepicker 里最关键的组件 -- Calendar 组件. 还有如何自定义 DateAdapter,让 Calendar 支持 TC39 ...