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中养成7个面向对象的好习惯
Jul 17 PHP
php ci框架验证码实例分析
Jun 26 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php实现的mongodb操作类实例
Apr 03 PHP
php+mysql实现无限级分类
Nov 11 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
Oct 22 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 PHP
实例化php类时传参的方法分析
Jun 05 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
什么是短波收听SWL
2021/03/01 无线电
用PHP实现图象锐化代码
2007/06/14 PHP
php面向对象的方法重载两种版本比较
2008/09/08 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
vue3.0 上手体验
2020/09/21 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
2020/11/06 Javascript
Python获取运行目录与当前脚本目录的方法
2015/06/01 Python
解密Python中的描述符(descriptor)
2015/06/03 Python
Python过滤列表用法实例分析
2016/04/29 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Python分类测试代码实例汇总
2020/07/23 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
详解numpy1.19.4与python3.9版本冲突解决
2020/12/15 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
澳大利亚实惠时尚女装商店:Katies
2019/06/16 全球购物
servlet面试题
2012/08/20 面试题
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
企业厂长岗位职责
2013/12/17 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
大学生受助感言
2015/08/01 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书