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中文本操作的类
Mar 17 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
JS 网站性能优化笔记
May 24 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
Sep 23 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
php上传文件中文文件名乱码的解决方法
Nov 01 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
laravel 实现用户登录注销并限制功能
Oct 24 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
2006/11/25 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
学习ExtJS table布局
2009/10/08 Javascript
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
学好js,这些js函数概念一定要知道【推荐】
2017/01/19 Javascript
Vue插件写、用详解(附demo)
2017/03/20 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
2019/09/16 Javascript
Python入门篇之对象类型
2014/10/17 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
python实现FTP服务器服务的方法
2017/04/11 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
python中的itertools的使用详解
2020/01/13 Python
python读取mysql数据绘制条形图
2020/03/25 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
HTTP状态码详解
2021/03/18 杂记
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
2014年车间工作总结
2014/11/21 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS