PHP迭代与递归实现无限级分类
Posted 终极用户
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP迭代与递归实现无限级分类相关的知识,希望对你有一定的参考价值。
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.
1.循环迭代实现
1 $arr = [ 2 1=>[\'id\'=>1,\'name\'=>\'父1\',\'father\'=>NULL], 3 2=>[\'id\'=>2,\'name\'=>\'父2\',\'father\'=>NULL], 4 3=>[\'id\'=>3,\'name\'=>\'父3\',\'father\'=>NULL], 5 4=>[\'id\'=>4,\'name\'=>\'儿1-1\',\'father\'=>1], 6 5=>[\'id\'=>5,\'name\'=>\'儿1-2\',\'father\'=>1], 7 6=>[\'id\'=>6,\'name\'=>\'儿1-3\',\'father\'=>1], 8 7=>[\'id\'=>7,\'name\'=>\'儿2-1\',\'father\'=>2], 9 8=>[\'id\'=>8,\'name\'=>\'儿2-1\',\'father\'=>2], 10 9=>[\'id\'=>9,\'name\'=>\'儿3-1\',\'father\'=>3], 11 10=>[\'id\'=>10,\'name\'=>\'儿3-1-1\',\'father\'=>9], 12 11=>[\'id\'=>11,\'name\'=>\'儿1-1-1\',\'father\'=>4], 13 12=>[\'id\'=>12,\'name\'=>\'儿2-1-1\',\'father\'=>7], 14 ]; 15 function generateTree($items){ 16 $tree = array(); 17 foreach($items as $item){ 18 if(isset($items[$item[\'father\']])){ 19 $items[$item[\'father\']][\'son\'][] = &$items[$item[\'id\']]; 20 }else{ 21 $tree[] = &$items[$item[\'id\']]; 22 } 23 } 24 return $tree; 25 } 26 $tree = generateTree($arr); 27 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不擅长递归,数据量大的情况下效率会显著降低
以上是关于PHP迭代与递归实现无限级分类的主要内容,如果未能解决你的问题,请参考以下文章