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异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
php使浏览器直接下载pdf文件的方法
Nov 15 PHP
php设计模式之单例模式使用示例
Jan 20 PHP
php全角字符转换为半角函数
Feb 07 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
smarty内置函数section的用法
Jan 22 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
Yii Framework框架使用PHPExcel组件的方法示例
Jul 24 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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 addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
查看python下OpenCV版本的方法
2018/08/03 Python
在PyCharm导航区中打开多个Project的关闭方法
2019/01/17 Python
Python同步遍历多个列表的示例
2019/02/19 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
最耐用行李箱,一箱永流传:Briggs & Riley(全球终身保修)
2017/12/07 全球购物
员工评语大全
2014/01/19 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
大学生求职信范文
2014/05/24 职场文书
运动会加油口号
2014/06/07 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2015年招聘工作总结
2014/12/12 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android
Python面向对象之内置函数相关知识总结
2021/06/24 Python
使用 Apache 反向代理的设置技巧
2022/01/18 Servers