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 相关文章推荐
PHP_Flame(Version:Progress)的原代码
Oct 09 PHP
php md5下16位和32位的实现代码
Apr 09 PHP
php zend解密软件绿色版测试可用
Apr 14 PHP
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
解析如何修改phpmyadmin中的默认登陆超时时间
Jun 25 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP的PDO操作简单示例
Mar 30 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 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
php下使用无限生命期Session的方法
2007/03/16 PHP
php下MYSQL limit的优化
2008/01/10 PHP
php中iconv函数使用方法
2008/05/24 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
PHP微信开发之模板消息回复
2016/06/24 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
js自带函数备忘 数组
2006/12/29 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
vue中子组件传递数据给父组件的讲解
2019/01/27 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
python的迭代器与生成器实例详解
2014/07/16 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python文本数据处理学习笔记详解
2019/06/17 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
Hibernate持久层技术
2013/12/16 面试题
施工班组长岗位职责
2014/01/05 职场文书
回门宴新郎答谢词
2014/01/12 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
销售人员工作自我评价
2014/09/21 职场文书
党支部对转正的意见
2015/06/02 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL