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的开发框架的现状和展望
Mar 16 PHP
php at(@)符号的用法简介
Jul 11 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
详解PHP处理字符串类似indexof的方法函数
Jun 11 PHP
PHP提取字符串中的手机号正则表达式怎么写
Jul 17 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
javascript实现随时变化着的背景颜色
2015/04/02 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
QML实现圆环颜色选择器
2019/09/25 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
JavaScript如何判断input数据类型
2020/02/06 Javascript
Python模块包中__init__.py文件功能分析
2016/06/14 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
Python Flask-web表单使用详解
2017/11/18 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
python GUI实现小球满屏乱跑效果
2019/05/09 Python
详解python运行三种方式
2019/05/13 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
python中的subprocess.Popen()使用详解
2019/12/25 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
寄语十八大感言
2014/02/07 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
钱学森观后感
2015/06/04 职场文书
Python time库的时间时钟处理
2021/05/02 Python