> ```
> public function treeBack($data,$pid){
> foreach($data as $k=>$v){
> if($v['pid'] == $pid){
> $v['child'] = $this->treeBack($data,$v['id']);
> $tree[] = $v;
> unset($data[$k]);
> }
> }
> return $tree;
> }
> ```
- 如上代码,这是一段很经典的无限递归循环逻辑,但是当数据量超过2000 - 3000行时,效率大打折扣,经过我们的实际应用测试,在没有优化这段代码之前,递归所耗费的时间是 2s 左右
- 但是经过优化之后,递归逻辑耗费的时间仅仅只有 86ms 左右
- OK,贴出下优化后的代码再来分析
> ```
> public function treeBack($data, $pidKey='pid', $idKey = 'id', $childKey='child') {
> $grouped = array();
> foreach ($flat as $sub){
> $grouped[$sub[$pidKey]][] = $sub;
> }
> $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey, $childKey) {
> foreach ($siblings as $k => $sibling) {
> $id = $sibling[$idKey];
> if(isset($grouped[$id])) {
> $sibling[$childKey] = $fnBuilder($grouped[$id]);
> usort($sibling[$childKey], function($a, $b) use ($childKey) {
> if ($a[$childKey] == $b[$childKey]) {
> return 0;
> }
> return ($a['weight'] < $b['weight']) ? -1 : 1;
> });
> }
> $siblings[$k] = $sibling;
> }
> return $siblings;
> };
> $tree = $fnBuilder($grouped[0]);
> return $tree;
> }
> ```
- 恩,你没有看错,将数据重新构造,然后进行匿名函数循环
- 前端
- 技巧汇总
- 构建 Node + Webpack + React 热加载开发环境
- React
- Redux
- Webpack
- ES6
- HTML5+CSS3
- Javascript
- JS超简洁拖动代码
- jQuery
- 后端
- 技巧汇总
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处
- PHP
- Xdebug不解之谜
- PHP时间获取
- PHP递归优化 使用匿名函数进行递归
- PHP 发起POST请求
- PHP获得数组的交集与差集
- PHP递归获取下级数组,可指定ID,一维数组
- PHP 判断是否为Get/Post/Ajax提交
- PHP实现分流队列平均显示信息
- PHP多维数组 指定列排序
- PHP 类Class详解 笔记记录
- PHP取整函数详解
- Node
- Elasticsearch
- 数据库
- 技巧汇总
- Mysql
- Mysql分区表实现
- Mysql union与union all 查询
- Mysql 表中表查询
- Mysql 分组查询 与 分组条件查询
- MySQL 添加列,修改列,删除列
- Mysql优化之:构建海量表,定位慢查询
- Mysql优化之:表的设计满足3NF
- Mysql优化常见方法
- Mysql存储过程详解
- 运维
- 技巧汇总
- Linux
- Linux Centos系统下 设置代理服务器上网
- Centos7增加开机启动脚本
- centos 挂载windows共享目录
- CentOS设置SSH Key登录
- Linux/CentOS单网卡绑定多个IP
- Windows
- Win10开机启动项设置全解攻略
- PuTTY连接Linux服务器经常断线解决方案
- Docker
- Docke启动文件 docker-compose.yml
- Docker命令简介(未完)
- Docker闲杂笔记
- Apache
- Nginx
- Nginx配置upstream实现负载均衡
- Nginx负载均衡学习
- IDE
- 技巧汇总
- WebStorm
- PHPStorm
- 协作
- 技巧汇总
- Git
- git 放弃本地修改 强制更新
- git编译安装与常用命令
- Svn