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可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
Codeigniter购物车类不能添加中文的解决方法
Nov 29 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
PHP实现自动发送邮件功能代码(qq 邮箱)
Aug 18 PHP
php strftime函数的详细用法
Jun 21 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设置图片文件上传大小的具体实现方法
2013/10/11 PHP
分析PHP中单双引号的误区和双引号小隐患
2016/07/19 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
javascript之学会吝啬 精简代码
2010/04/25 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
Django自定义分页效果
2017/06/27 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python数据处理——对pandas进行数据变频或插值实例
2020/04/22 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
公益活动策划方案
2014/01/09 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
实习护士自荐信
2014/06/21 职场文书
店铺转让协议书
2014/12/02 职场文书
护士辞职信怎么写
2015/02/27 职场文书
童年读书笔记
2015/06/26 职场文书
寒假致家长的一封信
2015/10/10 职场文书
志愿服务心得体会
2016/01/15 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS