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迭代与递归实现无限级分类的主要内容,如果未能解决你的问题,请参考以下文章

用迭代实现无限级分类

PHP利用递归函数实现无限级分类的方法_php技巧 - PHP

PHP_递归实现无限级分类

PHP无限级分类实现(递归+非递归)

PHP原生递归实现无限级分类树状展示数据

几十万条数据用PHP递归能实现无限级分类吗