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