PHP迭代与递归实现无限级分类


Posted in PHP onAugust 28, 2017

无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳.

1.循环迭代实现

$arr = [
  1=>['id'=>1,'name'=>'父1','father'=>NULL],
  2=>['id'=>2,'name'=>'父2','father'=>NULL],
  3=>['id'=>3,'name'=>'父3','father'=>NULL],
  4=>['id'=>4,'name'=>'儿1-1','father'=>1],
  5=>['id'=>5,'name'=>'儿1-2','father'=>1],
  6=>['id'=>6,'name'=>'儿1-3','father'=>1],
  7=>['id'=>7,'name'=>'儿2-1','father'=>2],
  8=>['id'=>8,'name'=>'儿2-1','father'=>2],
  9=>['id'=>9,'name'=>'儿3-1','father'=>3],
  10=>['id'=>10,'name'=>'儿3-1-1','father'=>9],
  11=>['id'=>11,'name'=>'儿1-1-1','father'=>4],
  12=>['id'=>12,'name'=>'儿2-1-1','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(json_encode($tree));

输出:

PHP迭代与递归实现无限级分类

分析:

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

优点:速度快,效率高.

缺点:数组的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>';
}

 输出:

PHP迭代与递归实现无限级分类

分析:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
10条PHP编程习惯助你找工作
Sep 29 PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
浅析关于PHP位运算的简单权限设计
Jun 30 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
php安全配置记录和常见错误梳理(总结)
Mar 28 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
Laravel相关的一些故障解决
Aug 19 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
Mar 09 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 #PHP
PHP大文件分割上传 PHP分片上传
Aug 28 #PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 #PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 #PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 #PHP
php检查函数必传参数是否存在的实例详解
Aug 28 #PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 #PHP
You might like
基于mysql的论坛(7)
2006/10/09 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
Angular实现响应式表单
2017/08/04 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
JS实现“全选”和&quot;全不选&quot;功能代码实例
2020/02/06 Javascript
Python中DJANGO简单测试实例
2015/05/11 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
python和opencv实现抠图
2018/07/18 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
2019/09/07 Python
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
小学少先队活动总结
2015/05/08 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
一行Python命令实现批量加水印
2022/04/07 Python