博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
迭代与递归实现无限级分类
阅读量:5983 次
发布时间:2019-06-20

本文共 5066 字,大约阅读时间需要 16 分钟。

无限级分类是开发中常见的情况了,在这里我收藏了下并整理了下常见的无限极分类算法总结归纳.

['id'=>1,'name'=>'家居','father'=>NULL], 2=>['id'=>2,'name'=>'服装','father'=>NULL], 3=>['id'=>3,'name'=>'护肤品','father'=>NULL], 4=>['id'=>4,'name'=>'生活日用','father'=>1], 5=>['id'=>5,'name'=>'家庭装修','father'=>1], 6=>['id'=>6,'name'=>'厨房卫浴','father'=>1], 7=>['id'=>7,'name'=>'男装','father'=>2], 8=>['id'=>8,'name'=>'女装','father'=>2], 9=>['id'=>9,'name'=>'面部护肤','father'=>3], 10=>['id'=>10,'name'=>'补水保湿','father'=>9], 11=>['id'=>11,'name'=>'收纳用品','father'=>4], 12=>['id'=>12,'name'=>'牛仔裤','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($tree);?>

输出:

Array(    [0] => Array        (            [id] => 1            [name] => 家居            [father] =>             [son] => Array                (                    [0] => Array                        (                            [id] => 4                            [name] => 生活日用                            [father] => 1                            [son] => Array                                (                                    [0] => Array                                        (                                            [id] => 11                                            [name] => 收纳用品                                            [father] => 4                                        )                                )                        )                    [1] => Array                        (                            [id] => 5                            [name] => 家庭装修                            [father] => 1                        )                    [2] => Array                        (                            [id] => 6                            [name] => 厨房卫浴                            [father] => 1                        )                )        )    [1] => Array        (            [id] => 2            [name] => 服装            [father] =>             [son] => Array                (                    [0] => Array                        (                            [id] => 7                            [name] => 男装                            [father] => 2                            [son] => Array                                (                                    [0] => Array                                        (                                            [id] => 12                                            [name] => 牛仔裤                                            [father] => 7                                        )                                )                        )                    [1] => Array                        (                            [id] => 8                            [name] => 女装                            [father] => 2                        )                )        )    [2] => Array        (            [id] => 3            [name] => 护肤品            [father] =>             [son] => Array                (                    [0] => Array                        (                            [id] => 9                            [name] => 面部护肤                            [father] => 3                            [son] => Array                                (                                    [0] => Array                                        (                                            [id] => 10                                            [name] => 补水保湿                                            [father] => 9                                        )                                )                        )                )        ))

分析:

这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.

优点:速度快,效率高.

缺点:数组的key值必须与id值相同,不便于取出数据(使用递归获取数据)

我们再看下递归的实现:

['id'=>1,'name'=>'家居','father'=>NULL], 2=>['id'=>2,'name'=>'服装','father'=>NULL], 3=>['id'=>3,'name'=>'护肤品','father'=>NULL], 4=>['id'=>4,'name'=>'生活日用','father'=>1], 5=>['id'=>5,'name'=>'家庭装修','father'=>1], 6=>['id'=>6,'name'=>'厨房卫浴','father'=>1], 7=>['id'=>7,'name'=>'男装','father'=>2], 8=>['id'=>8,'name'=>'女装','father'=>2], 9=>['id'=>9,'name'=>'面部护肤','father'=>3], 10=>['id'=>10,'name'=>'补水保湿','father'=>9], 11=>['id'=>11,'name'=>'收纳用品','father'=>4], 12=>['id'=>12,'name'=>'牛仔裤','father'=>7],];function generateTree($arr,$id,$step){ static $tree=[]; foreach($arr as $key=>$val) { if($val['father'] == $id) { $flag = str_repeat('└―',$step); $val['name'] = $flag.$val['name']; $tree[] = $val; generateTree($arr , $val['id'] ,$step+1); } } return $tree;}$tree = generateTree($arr,0,0);foreach ($tree as $val){ echo $val['name'].'
';}?>

输出:

家居└―生活日用└―└―收纳用品└―家庭装修└―厨房卫浴服装└―男装└―└―牛仔裤└―女装护肤品└―面部护肤└―└―补水保湿

分析:

利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

优点:方便遍历,查找父子元素

缺点:php不擅长递归,数据量大的情况下效率会显著降低

总结:两种方法各有利弊,后者不适合大数据下使用,前者推荐吧

转载地址:http://dzrox.baihongyu.com/

你可能感兴趣的文章
python学习笔记(05)
查看>>
JAVA BIO 服务器与客户端实现示例
查看>>
《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
查看>>
《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
查看>>
ruby动态new对象
查看>>
Linux中grep命令的12个实践例子
查看>>
使用Docker Compose部署基于Sentinel的高可用Redis集群
查看>>
Mybatis 3学习笔记(一)
查看>>
Guice系列之用户指南(十)
查看>>
树与森林的存储、遍历和树与森林的转换
查看>>
Android自定义属性
查看>>
Visual C#之核心语言
查看>>
代码重构(五):继承关系重构规则
查看>>
Windows App开发之集合控件与数据绑定
查看>>
中大型网站技术架构演变过程
查看>>
ARTS训练第三周
查看>>
vue中v-for循环如何将变量带入class的属性名中
查看>>
phpstorm xdebug remote配置
查看>>
引用与指针的区别
查看>>
pygtk笔记--2.1:布局容器,VBox、Hbox、Alignment
查看>>