首页 > 编程语言 >php生成树状层级子孙树

php生成树状层级子孙树

时间:2024-02-28 15:00:26浏览次数:19  
标签:层级 name 树状 list level pid php id

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

以下是迭代的代码实现

<?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去存储当前要找的那个父级,找到了就追加进去,层级++,找不到就弹出来一个,层级--

可以看一下以前我写递归的方式,递归就很好理解,但是自己心里面就是感觉效率上和安全上面差点意思,代码如下:

用数据库的数据算了一下效率,其实差不多,没有很明显的差距,当数据量只有几条的时候迭代比递归甚至还慢一点,当数据量有四千多条的时候(省市县三级数据)迭代比递归稍微快一点点,但是真的不明显。

看来这里还需要一个更强更好的算法来解决该问题啊!

 

标签:层级,name,树状,list,level,pid,php,id
From: https://www.cnblogs.com/lizhaoyao/p/18040409

相关文章

  • [安洵杯 2019]easy_serialize_php
    [安洵杯2019]easy_serialize_php<?php$function=@$_GET['f'];functionfilter($img){$filter_arr=array('php','flag','php5','php4','fl1g');$filter='/'.implode('|�......
  • CTFHUB-web-信息泄露-PHPINFO
    开启题目访问只有这一个页面,看一下flag在没在页面里信息发现:https://www.cnblogs.com/Cl0ud/p/15999347.html系统版本信息配置文件位置allow_url_fopen&allow_url_include文件包含必看选项之一,如果allow_url_fopen和allow_url_include都为On的时候,则文件包含函数......
  • 设置PHP最大连接数及php-fpm -static高并发
    设置PHP最大连接数及php-fpm高并发参数调整 服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)1234567891011121314151617181920212223[global]pid=/usr/local/php/var/run/php-fpm.piderror_log=/usr/local/php/var/log/ph......
  • Thinkphp
    官网https://www.thinkphp.cn/docComposerComposer是PHP的一个依赖管理工具,它允许你声明项目所需的库依赖,并且会为你安装它们。在许多方面,它与其他编程语言中的包管理工具类似,例如Node.js的npm或者Python的pip。使用Composer可以使PHP开发变得更加高效、组织化,并......
  • GraphPad Prism 10: 你的数据,我们的魔法 mac/win版
    GraphPadPrism10是GraphPadSoftware公司推出的一款功能强大的数据分析和可视化软件。它集数据整理、统计分析、图表制作和报告生成于一体,为科研工作者、学者和数据分析师提供了一个高效、便捷的工作平台。→→↓↓载GraphPadPrism10mac/win版Prism10拥有丰富的图表类型,......
  • PHP打印内置变量的内容
    PHP有很多内置全局变量,例如$_SERVER,$_POST等,本文采用将关联数组嵌套到普通数组内进行打印。方法1:<?php$array=array($_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV);foreach($arrayas$subarray){foreach($subarrayas$key=>$value)......
  • Docker安装mariadb数据库与web管理工具phpmyadmin
    安装mariadb数据库获取指定版本的mariadb数据库docker镜像使用dockersearchmariadb搜索相关镜像;MacBook-Pro:~chenxiaolong$dockersearchmariadbNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDmar......
  • 提高组算法-树状数组
    树状数组是当序列动态变化时,依然可以高效率的查询和维护前缀和(或区间和)的数据结构。实现思路现在有\(16\)个数字:\(a[]={1,8,5,9,6,3,9,8,7,2,3,9,6,4,1,7}\)。我们要实现\(2\)个函数:修改其中某个元素的数值。求出前\(n\)个数字的和。但是,这\(2\)个函数要在极......
  • POJ--3468 A Simple Problem with Integers(线段树/树状数组)
    记录11:032024-2-25http://poj.org/problem?id=1961线段树树状数组把区间增加转变为单点增加,利用两个树状数组\(c_0和c_1\)将”Clrd"转化为在树状数组\(c_0\)中,把位置l上的数加d在树状数组\(c_0\)中,把位置r+1上的数减d在树状数组\(c_1\)中,把位置l上的数......
  • PHP数据库连接
    PHP连接Mysql方式MySQLiextension("i"意为improved)PDO(PHPDataObjects)PDO应用在12种不同数据库中,MySQLi只针对MySQL数据库。phpinfo()查看是否安装PDOphp代码连接数据库<?php//MySQLi-面向对象$servername="localhost";$username="root";$pass......