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://dome.nekgod.cn/
遞迴:http://dome.nekgod.cn/recursion
相關文章
- PHP無限級分類的實現(不使用遞迴)PHP遞迴
- php利用遞迴函式實現無限級分類PHP遞迴函式
- php無限級分類函式(無極限)PHP函式
- PHP中的無限級分類、無限巢狀評論PHP巢狀
- PHP實現無限極分類PHP
- laravel模型無限分類Laravel模型
- PHP 無限級分類最佳實踐PHP
- 不用遞推實現無限極分類
- 分層資料 Hierarchical Data 探索 (1.遞迴) 無限極分類遞迴
- 使用遞迴實現樹狀選單(無限級分類)遞迴
- 哪位大師能用匿名遞迴下這個無限極分類?遞迴
- 高效能無限級分類實現思路
- PHP + MySQL 無限分類實現的2種方法PHPMySql
- PHP 快速掃描列表建立無限極分類樹PHP
- ThinkPHP 無線遞迴分類PHP遞迴
- 神坑·Python 裝飾類無限遞迴Python遞迴
- Laravel 框架實現無限極分類Laravel框架
- mysql 無限級分類實現思路MySql
- Javascript無限分類演算法(轉)JavaScript演算法
- 選單的無限極分類實現
- thinkphp5資料的無限分類PHP
- ThinkPHP 無限遞迴PHP遞迴
- 分享一個無限極分類的函式函式
- 無限級分類---有關查詢問題??
- PHP無限遞迴選單的實現流程PHP遞迴
- 無限遞迴導致StackOverflowError遞迴Error
- sql無限遞迴查詢SQL遞迴
- Ztree + PHP 無限級節點遞迴查詢PHP遞迴
- FreeSql 使用 ToTreeList/AsTreeCte 查詢無限級分類表SQLAST
- 無限級分類之Laravel-nestedset擴充套件包的使用Laravel套件
- MVC無限級分類01,分層架構,引入快取,完成領域模型與檢視模型的對映MVC架構快取模型
- 無限分級 方法總結
- 分層資料 Hierarchical Data 探索 (2.鄰接表模型) 無限極分類模型
- 分層資料 Hierarchical Data 探索 (3.巢狀集合模型) 無限極分類巢狀模型
- 分享一個用 ORM 寫無限極分類的帖子, 大佬請跳過.ORM
- 無限for迴圈(死迴圈)
- Adjacent List Model 與 Nested Set Model 兩種無限分類模型的對比模型
- oneTHINKPHP----1.1.140817_dev [2014.8.17]:無限分類不能新增,PHPdev