php 无限级分类树
阅读(1042)
2018-01-28
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
