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

以下是迭代的代码实现

<?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. thymeleaf学习问题整理

    使用配置 <properties> <java.version>1.8</java.version> <thymeleaf.version>3.0.9. ...

  2. SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

    目录 问题描述 解决方法: 问题描述 在运行向的时候出现报错: java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17. ...

  3. div中多行内容垂直居中显示

    div中多行内容垂直居中显示 一.css 样式 .wrap { height: 200px; width: 200px; border: 1px solid #232323; display: fle ...

  4. 在 Web 中判断页面是不是刷新

    在 Web 开发中,我们经常需要区分用户是否通过刷新操作重新加载了页面.这一操作可能是由用户手动刷新(如按下 F5 键或点击浏览器刷新按钮)或通过浏览器自动重新加载.判断页面是否刷新有助于开发者优化用 ...

  5. VMware安装CentOS7及远程登录详细教程

    写在前面 主要使用软件: VMware Workstation Pro17 Navicat Premium17 Xshell7 Xftp7 1.在虚拟机安装CentOS7 访问阿里云镜像站 ,选择标记 ...

  6. ASP.NET Core – Data Protection & Azure Storage + Azure Key Vault

    前言 以前就写过很多篇了 Asp.net core 学习笔记 ( Data protection ) Asp.net core 学习笔记 Secret 和 Data Protect Azure key ...

  7. Azure 入门系列 (第三篇 Publish Web Application to VM)

    本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...

  8. [TK] 盖房子 hzoi-tg#262

    同机房大佬也写了这题的 题解. 通解分析 此类问题我通常喜欢归纳成一类,即阻碍联通的坐标DP. 既然是阻碍联通,那么此类问题的通用思路是这样的: 首先将dp数组图形化. 一般用一个特定图形上的特定点来 ...

  9. 全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用

    全网最适合入门的面向对象编程教程:56 Python 字符串与序列化-正则表达式和 re 模块应用 摘要: Python 的 re 模块提供了强大的正则表达式操作功能,用于在字符串中搜索.匹配.替换等 ...

  10. 什么是WebRTC

    背景:webrtc web real-time communication 实时通信标准,提供了音视频通话系统的能力. 应用场景: 点对点视频聊天,如 微信视频,等实时视频通话应用. 多人视频会议,企 ...