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

<?php
$arr = [1=>['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值相同,不便于取出数据(使用递归获取数据)

我们再看下递归的实现:

<?php
$arr = [1=>['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'].'<br>';
}
?>

输出:

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

分析:

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

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

缺点:php不擅长递归,数据量大的情况下效率会显著降低
总结:两种方法各有利弊,后者不适合大数据下使用,前者推荐吧

迭代与递归实现无限级分类相关推荐

  1. php如何对 mysql 中text类型拆分存入一个数组_PHP递归实现无限级分类,可选返回字符串和数组...

    正 文: 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是 ...

  2. php递归分组,PHP递归实现无限级分类

    本篇文章的内容是PHP递归实现无限级分类,现在分享给大家,有需要的朋友也可以参考一下,大家一起过来看看吧$datasection = array( array('id' => 1, 'name' ...

  3. PHP_递归实现无限级分类

    <?php/*** 递归方法实现无限级别分类* @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid]* @param int $pid=0 父级 ...

  4. php无限级分类是什么意思,PHP 无限级分类(递归)

    网上有很多,这是我自己做测试用的 $arr = array( array('id'=>1,'name'=>'电脑','pid'=>0), array('id'=>2,'name ...

  5. php无极分类非递归_php实现无限级分类(递归方法)

    相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 到网上一搜php无限极分类,很多 ...

  6. php无限分类原理,php 递归无限级分类原理和实现代码

    递归无限级分类的原理: 每一个分类都记录它的父级id,当为顶级分类时,父级id为0.这样无论哪个分类,都可以通过父级id一层一层去查明它的所有父级,以便清楚知道它所属何种分类,层级深度为几. 对数据进 ...

  7. php递归 返回数组,php 递归 无限级分类并返回数组的例子

    /** * 递归 无限级分类 返回数组 * link:www.jquerycn.cn * date:2013/2/21 */ $conn = mysql_connect('localhost','ro ...

  8. php无极分类非递归_PHP中的无限级分类、无限嵌套评论

    php中文网最新课程 每日17点准时技术干货分享 一般来说,递归被称为函数自身的调用. 递归在开发中的实际运用 N级分类 无限级的分类在平常的开发中是常见的需求,并且在不少面试题中都会碰到.不管你做什 ...

  9. 帖子回复——无限级分类

    若是QQ空间那种,这里无需再使用无限级分类. 而是帖子之下的评论回复使用字段标记分清从属后按时间排序就行 //根据回复评论表,查询出回复人和被回复人信息 select acrr.id,comment_ ...

最新文章

  1. 设置php-fpm使用socket文件
  2. FIR滤波器设计(包括Verilog HDL设计以及MATLAB设计)
  3. 隔板都被拉去做核酸了?
  4. 用界面读取图片并且保存图片的方法
  5. CSP认证201809-1 卖菜[C++题解]:遍历
  6. localdatetime转化为date_为啥你用@JsonFormat注解时,LocalDateTime会反序列化失败?
  7. haskell程序设计语言
  8. 有关锁和内存使用的DMV
  9. 列级触发器 SQL Server
  10. Dxperience 7.3.4 简体中文本地化
  11. Linux 环境 简单启动 Java程序
  12. DS8700 的CPU、缓存的选择及配置
  13. python 正数变成负数_初一数学上册第一章有理数1.1正数和负数基础知识概括及同步练习题含解析...
  14. SAP SD初阶之VL10A为销售订单创建外向交货单
  15. 干货分享:今天谈谈大学生该如何运营校园微信公众号!
  16. 大数据-玩转数据-IDEA创建Maven工程
  17. mysql数据库 数据查询闯关(头哥)
  18. int, long int, long long int, _int64範圍
  19. POJ1036 Gangsters
  20. cfa考试用计算机,2021年CFA机考考试需要带计算器吗?

热门文章

  1. 5.STM32外设都有哪几类寄存器?(详解)
  2. mybaits五:主键的自增
  3. BPI:bit for Webduino WEB:Bit 教育版平台正式发布,支持离线安装使用
  4. Android之TableLayout表格布局
  5. Spring Boot 13 之freemarker
  6. Nosql and Mongodb 介绍
  7. zlog使用手册,小靠谱啊
  8. [开源]KJFramework.Message 智能二进制消息框架 -- 性能提升
  9. python 信息加密
  10. 四川职业学校计算机专业那个好6,四川排名前六的单招学院那些专业比较好?