这里首先介绍一下,什么是无限极分类?

无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样

示例如图:

那PHP又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢?

方法一、递归思想

PHP大部分人用递归来写生成树,不过PHP默认最多递归次数为100,并不是理论上的无限,其次递归的内存占有过大,php的内存分配是除了对象,其余的为直接copy内存,所以有时候会导致内存占用过大

 public function generateTree($items , $pId){$tree = [];foreach($items as $k => $v){if($v['pid'] == $pId){if (!empty($this->generateTree($items , $v['id']))){$v['childs'] = $this->generateTree($items , $v['id']);                      }$tree[] = $v;}}return $tree;}generateTree($array,0);

缺点: 一旦数据量大,耗时非常长,影响性能.

二、引用思想

// 例子:
$arr=array(    array('id'=>'1','name'=>'北京','pid'=>'0'),    array('id'=>'2','name'=>'上海','pid'=>'0'),    array('id'=>'3','name'=>'浦东','pid'=>'2'),    array('id'=>'4','name'=>'朝阳','pid'=>'1'),    array('id'=>'5','name'=>'广州','pid'=>'0'),    array('id'=>'6','name'=>'三里屯','pid'=>'4'),   array('id'=>'7','name'=>'广东','pid'=>'5'),   array('id'=>'8','name'=>'三里','pid'=>'4'),  array('id'=>'10','name'=>'小胡同','pid'=>'8')  );

首先 : 利用数组的索引与主键的id号相同来查找子栏目,首先为数组加上索引:


$arr=array(    1=>array('id'=>'1','name'=>'北京','pid'=>'0'),    2=>array('id'=>'2','name'=>'上海','pid'=>'0'),    3=>array('id'=>'3','name'=>'浦东','pid'=>'2'),    4=>array('id'=>'4','name'=>'朝阳','pid'=>'1'),    5=>array('id'=>'5','name'=>'广州','pid'=>'0'),    6=>array('id'=>'6','name'=>'三里屯','pid'=>'4'),   7=>array('id'=>'7','name'=>'广东','pid'=>'5'),   8=>array('id'=>'8','name'=>'三里','pid'=>'4'),  10=>array('id'=>'10','name'=>'小胡同','pid'=>'8')  );

利用索引的下标,判断该栏目是否存在父栏目,如果存在就把该栏目放到父栏目的son子数组里面

 function generateTree($items){$index_items = [];foreach ($items as $item) {$index_items[$item['id']] = $item;}$tree = array();foreach($index_items as $item){//判断是否有数组的索引==if(isset($index_items[$item['pid']])){     //查找数组里面是否有该分类  如 isset($items[0])  isset($items[1])$index_items[$item['pid']]['son'][] = &$index_items[$item['id']]; //上面的内容变化,$tree里面的值就变化}else{$tree[] = &$index_items[$item['id']];   //把他的地址给了$tree}}return $tree;}generateTree($array);

***进阶版:  参数默认可传

function tree(array $array,string $first,string $pid,string $id,string $child = 'childs'): array {$tree = [];foreach ($array as $item) {$tree[$item[$id]] = $item;}foreach ($tree as $item) {$tree[$item[$pid]][$child][] = &$tree[$item[$id]];}return $tree[$first][$child] ?? [];}tree($array,'1','pid','id');

参考: php实现无限极分类_叶落无痕的博客-CSDN博客_无限极分类

php 实现无限极分类树 (引用和递归)相关推荐

  1. 无限极分类php简单,创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...

  2. php 无限极分类树,php无限极分类 类 tree.class.php

    /** * 通用的树型类,可以生成任何树型结构 */ class tree { /** * 生成树型结构所需要的2维数组 * @var array */ public $arr = array(); ...

  3. php 递归实现无限极分类和排序_php递归无限极分类

    递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: $data = array( 1 => array( 'id' => 1, 'pid' => ...

  4. php根据分类生成网址,PHP实现无限极分类生成分类树的方法

    本文实例讲述了PHP实现无限极分类生成分类树的方法.分享给大家供大家参考,具体如下: 现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出 ...

  5. php无限极递归概念,php无限极分类递归与普通

    1. 递归 public function getInfo(){ $data=$this->select(); $arr=$this->noLimit($data,$f_id=0,$lev ...

  6. php不使用递归实现无限极分类

    无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...

  7. php无限极分类 退出,PHP实现无限极分类图文教程

    一般来说实现无限极分类都是使用递归或者迭代的方式,小伙伴们看下本文的实现方式吧. 1,数据库设计: 2,代码: /** * @author koma * @todo   PHP无限极分类 */ $cn ...

  8. php 递归实现无限极分类和排序_无限极分类的两种方式,递归和引用

    说到无限极分类,比较常见的做法是在建表的时候,增加一个parnet_id字段用来区别自己所属的分类(是顶级分类还是子分类) 由于展示数据的时候,需要表达出这种所属关系,所以必然要在读取数据的时候进行一 ...

  9. 无限极分类JAVA 实现—查子孙树、家谱树

    无限极分类JAVA  实现-查子孙树.家谱树 效果展示: import java.util.*;public class Test {List<HashMap<String, Object ...

最新文章

  1. 一步一步学习hadoop(七)
  2. 用c语言做教学课程安排,C语言入门课程安排
  3. 全站 HTTPS 就一定安全了吗?
  4. 简单深搜(poj 3009)
  5. 2017年终奖发放,程序员人均11776元排名第一!
  6. 模糊综合评价模型详解
  7. 【读书笔记】-《软件测试的艺术》
  8. wget下载报错403
  9. html5图片在线剪辑,Web端裁剪图片方法
  10. hdu6287 口算训练
  11. 计算机云平台热门吗,哪个云电脑好用又便宜?国内的云游戏平台到底哪个好?
  12. 计算机基础知识 pdf答案,计算机基础知识试题及答案(一).pdf
  13. 明明输给了 SpaceX,OneWeb 为什么还能拿到英国政府的钱?
  14. 视频配音文字转语音怎么弄?介绍几种好用的方法给你
  15. adb install 命令参数
  16. java 最小公倍数_Java求最大公约数和最小公倍数
  17. THUWC2019 游记
  18. Linux free -g 详解
  19. 微软研发经理邹欣谈IT教育:推荐《我是一只IT小小鸟》
  20. Spring,SpringBoot,Springcloud都是干嘛的?

热门文章

  1. 关于eclipse的Java文件前面有红色感叹号的解决办法
  2. 4.函数数据类型的运行机制
  3. 窗口部件标志和几何布局
  4. Office开发工具Spire.office与WebOffice有何不同?
  5. 离线安装yum,配置yum源
  6. 模块式柔性自动化生产线实训系统
  7. Gartner:2021 年塑造未来的 9 大技术趋势
  8. T-SQL之查询操作
  9. 提高文件共享服务器速度,通过云服务器共享以优化网站速度并提高转换率
  10. 英语口语279之每日十句口语