php 无限极分类递归实现,无限极分类引入实现,性能差距

php 无限分类递归 和 无限分类引入 的性能差距

      引用方法:
      function generateTree($array){
            //第一步 构造数据
            $items = array();
            foreach($array as $value){
                $items[$value['id']] = $value;
            }
            //第二部 遍历数据 生成树状结构
            $tree = array();
            $level = 0;
            foreach($items as $key => $item){
                if(isset($items[$item['pid']])){
                    $items[$key]['level'] = $level;
                    $items[$item['pid']]['son'][] = &$items[$key];
                }else{
                    $level = 0;
                    $items[$key]['level'] = $level;
                    $tree[] = &$items[$key];
                }
            }
            return $tree;
        }
        输出代码: 
        $array = Db::name('area')->select();
        $arr = $this->generateTree($array);
        $queue = new \SplQueue();
        foreach ($arr as $vo) {
            $vo['level'] = 0;
            $queue->push($vo);
        }
        while (!$queue->isEmpty()) {
            $val = $queue->shift();
            echo str_repeat('-', $val['level']).$val['name'].'
';
            if (!empty($val['son'])) {
                for ($index = count($val['son']) - 1; $index >= 0; $index--) {
                    $val['son'][$index]['level'] = $val['level'] + 1;
                    $queue->unshift($val['son'][$index]);
                }

                continue;
            }
        }
         递归方法:
         function getTree($array, $pid =0, $level = 0){
            //声明静态数组,避免递归调用时,多次声明导致数组覆盖
            static $list = [];
            foreach ($array as $key => $value){
                //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
                if ($value['pid'] == $pid){
                    //父节点为根节点的节点,级别为0,也就是第一级
                    $value['level'] = $level;
                    //把数组放到list中
                    $list[] = $value;
                    //把这个节点从数组中移除,减少后续递归消耗
                    unset($array[$key]);
                    //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
                    $this->getTree($array, $value['id'], $level+1);
    
                }
            }
            return $list;
         }
        输出方法:
        $array = $this->getTree($array);
        foreach ($array as $vo) {
            echo str_repeat(\' - \', $vo[\'level\']).$vo[\'name\'].\' < br>\';
        }

我上面写引入的性能 目前是差不多是 递归 10倍左右
引入响应数据缓存的情况下是差不多67-100ms左右
递归的话 是差不多 600-不等 可能内存泄漏啊 或者其它的问题 反正极其不稳定
查看性能地址
引入: http://1.15.82.193:81/api/demo/import
递归: http://1.15.82.193:81/api/demo/recursion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值