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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
php绝对路径与相对路径之间关系的的分析
Mar 03 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
Javascript与PHP验证用户输入URL地址是否正确
Oct 09 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
Nov 22 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
PHP三种方式实现链式操作详解
Jan 21 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 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
浅谈Laravel队列实现原理解决问题记录
Aug 19 #PHP
You might like
php学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
Vue+axios 实现http拦截及路由拦截实例
2017/04/25 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
对Python3 pyc 文件的使用详解
2019/02/16 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
python SOCKET编程基础入门
2021/02/27 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
非常详细的C#面试题集
2016/07/13 面试题
三年级数学教学反思
2014/01/31 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python