php无限级tree,用迭代和递归方式实现php递归实现无限级分类树。树状列表常常用户分类、节点、菜单和导航等等。
迭代:函数内某段代码实现循环
递归:重复调用函数自身实现循环
第一:迭代(效率高)function list_to_tree($list){
$list = array_column($list, null, 'id');
foreach ($list as $key => $val) {
if ($val['pid']) {
if(isset($list[$val['pid']])){
$list[$val['pid']]['children'][] = &$list[$key];
}
}
}
foreach($list as $key=>$val){
if($val['pid']) unset($list[$key]);
}
return array_values($list);
}
第二:递归(不推荐)
嵌套不能超过100重,否则报 Fatal error: Maximum function nesting level of '100' reached, aborting!function list_to_tree1($arr, $id=0){
$tree = array();
foreach($arr as $key=>$val) {
if($val['pid'] == $id) {
unset($arr[$key]);
$val['children'] = $this->list_to_tree1($arr, $val['id']);
if(empty($val['children'])){
unset($val['children']);
}
$tree[] = $val;
}
}
return $tree;
}
使用迭代和递归效果:$list = array(
0=>array('id'=>1,'pid'=>0,'name'=>'test1'),
1=>array('id'=>2,'pid'=>1,'name'=>'test2'),
2=>array('id'=>3,'pid'=>2,'name'=>'test3'),
3=>array('id'=>4,'pid'=>0,'name'=>'test4'),
4=>array('id'=>5,'pid'=>4,'name'=>'test5'),
5=>array('id'=>6,'pid'=>4,'name'=>'test6'),
);
$res = $this->list_to_tree($list);
//$res = $this->list_to_tree1($list);
print_r($res);
都输出:Array(
[0] => Array(
[id] => 1
[pid] => 0
[name] => test1
[children] => Array(
[0] => Array(
[id] => 2
[pid] => 1
[name] => test2
[children] => Array(
[0] => Array(
[id] => 3
[pid] => 2
[name] => test3
)
)
)
)
)
[1] => Array(
[id] => 4
[pid] => 0
[name] => test4
[children] => Array(
[0] => Array(
[id] => 5
[pid] => 4
[name] => test5
)
[1] => Array(
[id] => 6
[pid] => 4
[name] => test6
)
)
)
)
迭代和递归生成树的效率对比:
写一段代码模拟分类数据:2000条分类数据,层数3层$list = [];
for ($i=1;$i<=2000;$i=$i+3){
$list[] =array('id'=>$i,'pid'=>0,'name'=>'test'.$i);
$list[] =array('id'=>$i+1,'pid'=>$i,'name'=>'test'.($i+1));
$list[] =array('id'=>$i+2,'pid'=>$i+1,'name'=>'test'.($i+2));
}
测试效率:
1、迭代$start = microtime(true);
$res = $this->list_to_tree($list);
$end = microtime(true);
print_r(round($end-$start,3));
//用时:0.006秒
2、递归$start = microtime(true);
$res = $this->list_to_tree1($list);
$end = microtime(true);
print_r(round($end-$start,3));
//用时:1.942秒
原创文章,转载请注明出处:https://www.weizhixi.com/article/68.html