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

以下是迭代的代码实现

<?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. 安装 MinGW-w64

    简介 MinGW-w64 是 MinGW 项目的 64 位版本.MinGW(Minimalist GNU for Windows)是 GCC 编译套件和 GNU Binutils 移植到 Window ...

  2. 【图文教程】Centos单机安装Redis

    1.1.安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖: yum install -y gcc tcl 1.2.上传安装包并解压 ​ 例如,凯哥将其放到 ...

  3. DPABInet做 Network Contruction时一直报错“函数或变量 'nets_netmats' 无法识别”

    DPABInet模块做 Network Contruction时一直显示报错"函数或变量 'nets_netmats' 无法识别",是因为没有将FSLNets导入路径,所以找不到该 ...

  4. 【YashanDB数据库】Yashandb表闪回业务表实践

    数据误删除 DELETE 操作闪回 示例(HEAP表) 基于闪回查询(建议): select * from sales.branches1; BRANCH_NO BRANCH_NAME AREA_NO ...

  5. css+div实现各种常见边框

    css+div实现各种常见边框 一.效果图如下 二.实现代码 div { width: 120px; height: 100px; margin: 10px; float: left; text-al ...

  6. 爬虫案例2-爬取视频的三种方式之一:selenium篇(2)

    @ 目录 前言 selenium简介 实战案例 共勉 博客 前言 继使用requests库爬取好看视频的文章后,本文分享使用python第三方库selenium库接着来爬取视频网站,后续也会接着分享使 ...

  7. CSS – Transition & Animation

    前言 之前的笔记 CSS – W3Schools 学习笔记 (3) 就有讲过 CSS Transitions 和 CSS Animations. 这里做一个整理, 补上一些细节. Transition ...

  8. Java中使用BigDecimal进行double类型的计算(高精度,可保留几位小数)

    Java中 小数直接进行乘除运算,会出现精度问题导致计算结果有误需要使用 BigDecimal 类型辅助运算,保证精度无误源码: import java.math.BigDecimal;import ...

  9. 解决每次调试flask需要重启本地服务器的方法

    export FLASK_ENV=development export FLASK_APP=hello.py flask run --debug

  10. 离线安装Redis

    redis 直接去官网下载tar包就可以 主要是gcc 环境的安装包不太好找,我下载的还缺少 make 如果服务器比较干净,还得预装一下lrzsz-0.12.20.tar.gz 上传下载文件,unzi ...