> ```
> 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