zoukankan      html  css  js  c++  java
  • 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不擅长递归,数据量大的情况下效率会显著降低

  • 相关阅读:
    DataGrid
    取整、取小数点位数
    如何跨浏览器使用连续字符的换行
    如何给 legend 标签设定宽度
    25个简洁优美的网站设计
    重新发现HTML表格
    用户研究角度看设计(2):用户为何视若无睹
    lineheight 属性的继承问题
    jQuery技巧总结
    web2.0网站配色方案
  • 原文地址:https://www.cnblogs.com/shenzikun1314/p/7467148.html
Copyright © 2011-2022 走看看