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不擅长递归,数据量大的情况下效率会显著降低

时间: 2024-11-15 02:45:50

PHP迭代与递归实现无限级分类的相关文章

PHP不使用递归的无限级分类

不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点 代码: <?php $list = array( array('id'=>1, 'pid'=>0, 'deep'=>0, 'name'=>'test1'), array('id'=>2, 'pid'=>1, 'deep'=>1, 'name'=>'test2'), array('id'=>3, 'pid'=>0, 'deep'=>0, 'n

(实用篇)PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. 首先

PHP递归实现无限级分类

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. My

PHP_递归实现无限级分类

<?php /** * 递归方法实现无限级别分类 * @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid] * @param int $pid=0 父级id * @param int $level=0 缩进次数[用于指定分类名称要缩进的数量] */ function getTree($list,$pid=0,$level=0 ) { // static 表示声明一个静态变量, 静态变量在函数中会一直保存它的值 static $tree = arr

php下利用递归实现无限级分类

<?php //分析 /* 福建省 福州市 龙岩市 广东省 广州市 佛山市 晋江市 江门市 江西省 南昌市 赣州市 宁都县 大余县 信封县 吉安市 cat_id pri parent_id 1 福建省 0 2 福州市 1 3 龙岩市 1 4 广东省 0 5 广州市 4 6 佛山市 4 7 晋江市 4 8 江门市 7 9 江西省 0 10 南昌市 9 11 赣州市 9 12 宁都县 11 13 大余县 11 14 信封县 11 15 吉安市 9 16 */ ?> <?php header(

PHP递归重新排序无限级分类数组

public static function Menus($id,$spac=0){ /* $data = array( 1 => array('id' => 1,'name' => 'name1','pid' => 0), 2 => array('id' => 2,'name' => 'name2','pid' => 0), 3 => array('id' => 3,'name' => 'name3','pid' => 1), 4

mysql无限级分类实现基于汇报关系的信息管理权限

汇报关系和家族族谱的实现类似,采用树的数据结构进行定义,树采用递归进行定义.即要嘛是一个根节点,要嘛是由一个根节点和其子树组成.OA中的汇报关系也采用这种结构(与树稍有不同),除董事长外,其他人有且只有一个非其本人的直接主管,董事长的直接主管和越级主管是其本人.从以上的定义其实可以看出,汇报关系类似树,但又与树并不完全相同.除董事长外,其他汇报关系均是树形结构.树形结构采用递归定义,如采用递归查询是非常耗时的操作.比如以下需求: 1.主管可以看到所有直线下属的绩效信息: 针对以上需求,我们提出三

用迭代实现无限级分类

说起那个无限级分类,相信很多人都知道是什么东西,也曾经做过.我也相信,大家用得最多的实现方式就是做一个递归. 最近我也要做一个带无限级分类的菜单,但是我又不想用递归来做,所以我需要用其他方式来实现,那就是迭代了. 首先,我需要定义一个实体模型,这举一个省市无限级的例子: class Loaction { public int ID { get; set; } public int PID { get; set; } public string Name { get; set; } //地方名 p

PHP无限级分类-递归(不推荐)

[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义