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执行速度全攻略(上)
Oct 09 PHP
PHP CKEditor 上传图片实现代码
Nov 06 PHP
smarty中先strip_tags过滤html标签后truncate截取文章运用
Oct 25 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
php实现根据url自动生成缩略图的方法
Sep 23 PHP
php读取csv文件并输出的方法
Mar 14 PHP
Yii清理缓存的方法
Jan 06 PHP
Yii数据库缓存实例分析
Mar 29 PHP
WAF的正确bypass
Jan 05 PHP
PHP高精确度运算BC函数库实例详解
Aug 15 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
Mar 22 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
带左右箭头图片轮播的JS代码
2013/12/18 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
JavaScript作用域示例详解
2016/07/07 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
python async with和async for的使用
2019/06/20 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
python中常见错误及解决方法
2020/06/21 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
先进工作者个人总结
2015/02/15 职场文书
获奖感言一句话
2015/07/31 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript