php 实现无限极分类树 (引用和递归)
这里首先介绍一下,什么是无限极分类?
无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象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 实现无限极分类树 (引用和递归)相关推荐
- 无限极分类php简单,创建无限极分类树型结构的简单方法
先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...
- php 无限极分类树,php无限极分类 类 tree.class.php
/** * 通用的树型类,可以生成任何树型结构 */ class tree { /** * 生成树型结构所需要的2维数组 * @var array */ public $arr = array(); ...
- php 递归实现无限极分类和排序_php递归无限极分类
递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: $data = array( 1 => array( 'id' => 1, 'pid' => ...
- php根据分类生成网址,PHP实现无限极分类生成分类树的方法
本文实例讲述了PHP实现无限极分类生成分类树的方法.分享给大家供大家参考,具体如下: 现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出 ...
- php无限极递归概念,php无限极分类递归与普通
1. 递归 public function getInfo(){ $data=$this->select(); $arr=$this->noLimit($data,$f_id=0,$lev ...
- php不使用递归实现无限极分类
无限极分类常用的是递归,但是比较不好理解,其实可以用数据库path,pid两个字段的设计来实现无限分类的功能 1.数据库设计 通过上图可以看出pid就是该栏目的父id,而path = 父path+pi ...
- php无限极分类 退出,PHP实现无限极分类图文教程
一般来说实现无限极分类都是使用递归或者迭代的方式,小伙伴们看下本文的实现方式吧. 1,数据库设计: 2,代码: /** * @author koma * @todo PHP无限极分类 */ $cn ...
- php 递归实现无限极分类和排序_无限极分类的两种方式,递归和引用
说到无限极分类,比较常见的做法是在建表的时候,增加一个parnet_id字段用来区别自己所属的分类(是顶级分类还是子分类) 由于展示数据的时候,需要表达出这种所属关系,所以必然要在读取数据的时候进行一 ...
- 无限极分类JAVA 实现—查子孙树、家谱树
无限极分类JAVA 实现-查子孙树.家谱树 效果展示: import java.util.*;public class Test {List<HashMap<String, Object ...
最新文章
- 一步一步学习hadoop(七)
- 用c语言做教学课程安排,C语言入门课程安排
- 全站 HTTPS 就一定安全了吗?
- 简单深搜(poj 3009)
- 2017年终奖发放,程序员人均11776元排名第一!
- 模糊综合评价模型详解
- 【读书笔记】-《软件测试的艺术》
- wget下载报错403
- html5图片在线剪辑,Web端裁剪图片方法
- hdu6287 口算训练
- 计算机云平台热门吗,哪个云电脑好用又便宜?国内的云游戏平台到底哪个好?
- 计算机基础知识 pdf答案,计算机基础知识试题及答案(一).pdf
- 明明输给了 SpaceX,OneWeb 为什么还能拿到英国政府的钱?
- 视频配音文字转语音怎么弄?介绍几种好用的方法给你
- adb install 命令参数
- java 最小公倍数_Java求最大公约数和最小公倍数
- THUWC2019 游记
- Linux free -g 详解
- 微软研发经理邹欣谈IT教育:推荐《我是一只IT小小鸟》
- Spring,SpringBoot,Springcloud都是干嘛的?