PHP迭代与递归实现无限级分类
2018-09-07 12:00
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
1.循环迭代实现
$arr = [ 1=>[id=>1,name=>父1,father=>NULL], 2=>[id=>2,name=>父2,father=>NULL], 3=>[id=>3,name=>父3,father=>NULL], 4=>[id=>4,name=>儿1-1,father=>1], 5=>[id=>5,name=>儿1-2,father=>1], 6=>[id=>6,name=>儿1-3,father=>1], 7=>[id=>7,name=>儿2-1,father=>2], 8=>[id=>8,name=>儿2-1,father=>2], 9=>[id=>9,name=>儿3-1,father=>3], 10=>[id=>10,name=>儿3-1-1,father=>9], 11=>[id=>11,name=>儿1-1-1,father=>4], 12=>[id=>12,name=>儿2-1-1,father=>7], ]; function generateTree($items){ $tree = array(); foreach($items as $item){ if(isset($items[$item[father]])){ $items[$item[father]][son][] = &$items[$item[id]]; }else{ $tree[] = &$items[$item[id]]; } } return $tree; } $tree = generateTree($arr); print_r(json_encode($tree));
输出:
分析:
这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.
优点:速度快,效率高.
缺点:数组的key值必须与id值相同,不便于取出数据(同样使用迭代获取数据)
2.递归实现
$arr = [ 0=>[id=>1,name=>父1,father=>0], 1=>[id=>2,name=>父2,father=>0], 2=>[id=>3,name=>父3,father=>0], 3=>[id=>4,name=>儿1-1,father=>1], 4=>[id=>5,name=>儿1-2,father=>1], 5=>[id=>6,name=>儿1-3,father=>1], 6=>[id=>7,name=>儿2-1,father=>2], 7=>[id=>8,name=>儿2-1,father=>2], 8=>[id=>9,name=>儿3-1,father=>3], 9=>[id=>10,name=>儿3-1-1,father=>9], 10=>[id=>11,name=>儿1-1-1,father=>4], 11=>[id=>12,name=>儿2-1-1,father=>7], ]; function generateTree($arr,$id,$step){ static $tree=[]; foreach($arr as $key=>$val) { if($val[father] == $id) { $flg = str_repeat(└―,$step); $val[name] = $flg.$val[name]; $tree[] = $val; generateTree($arr , $val[id] ,$step+1); } } return $tree; } $tree = generateTree($arr,0,0); foreach ($tree as $val){ echo $val[name].<br>; }
输出:
分析:
利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组
优点:方便遍历,查找父子元素
缺点:php不擅长递归,数据量大的情况下效率会显著降低
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。