襄阳网站建设开发:thinkphp无限级分类的实现方法(读取)

建站学堂     |      2020-04-13 | 阅读数:23次

[success]这里是无限级分类的重点,也是难点,下面会给出几种方法来这现无限级分类,在这里咱们会把无限级分类的读取的方法放在模型(/admin/model/Category.php)中。

[danger]无论使用何种方法进行无限级分类的读到,原理都是一样的。

[success]# 原理:把数据库中的分类信息按照一定的规律重新排序,然后返回重新排序后的数据。

要实现以上功能,需要解决如下问题:

1. 按照一定规律重新排序

[danger]例如:给出一个顶级分类,要实现以上功能,需要把该顶目分类下的所以子分类,以及子分类的子分,全部找出来,标记出所以子分类的父子关系,然后把们按照父子关系顺序排列在一起。  在这里会使用递归来循环判断是否是其子分类,如果是就记录下来(在这里需要用到一个固定的容器入放置该结果)。

2. 放置结果的“固定容器”

[danger]能够在这里使用的固定容器,需要具备以下特点:

  1. 在整个程序执行过程中,不会重置容易中的内容,也就是说容器是只进不出的。一般会使用全局变量或者静态变量等来做为“容器”。

  2. 也可以使用普通变量,但是每次改变变量的值时,都要保留变量原有的数据。

3. 父子关系的层级显示

[danger]最终获取的数据,要能体现分类的层级关系 在这里会用一个变量来记录每一个分类的层级关系。

无限级分类的读取方法(难点)

[info]在这里会通过几种方法来实现无限级分类的读取。

在这里把分类表中的所以分类数据存储到$data中,下面的分类信息都从这里来获取。

1. 普通变量的方式

[danger]要保证,变量的值是最新的完整的数据。在这里会用到数据的合并,这样是为了每次执行后,把变量中的原数据进行保留。

/** *$data 全部的分类数据 *$pid 上级分类id 默认为 0(顶级分类) *$level 层级关系 默认为0(顶级分类) **/ public function getcates($data,$pid=0,$level=0){     $arr=array();         foreach($data as $v){             if($v['pid']==$pid){                 $v['level']=$level;                 $arr[]=$v;                 $arr_cate=$this->getcates($data,$v['id'],$level+1);                 $arr=array_merge($arr,$arr_cate);//数据的合并,这里是重点             }         }         return $arr; }

2. 静态变量的方式

[danger]使用这种方式时,不需要进行数组的合并,因为静态变量在程序执行过程中,不会清楚原有数据,所以只需要把符合条件的直接加入即可。

/** *$data 全部的分类数据 *$pid 上级分类id 默认为 0(顶级分类) *$level 层级关系 默认为0(顶级分类) **/ public function getcates($data,$pid=0,$level=0){     static $arr=array();//定义一个静态变量,这里是重点         foreach($data as $v){             if($v['pid']==$pid){                 $v['level']=$level;                 $arr[]=$v;                 $this->getcate2($data,$v['id'],$level+1);             }         }         return $arr; }

3. 全局变量的方式

[danger]全局变量和静态变理的原理一下,只是定义变量的方式不同

/** *$data 全部的分类数据 *$pid 上级分类id 默认为 0(顶级分类) *$level 层级关系 默认为0(顶级分类) **/ public function getcates($data,$pid=0,$level=0){         global $arr;//定义一个全局变理,这里是重点         foreach($data as $v){             if($v['pid']==$pid){                 $v['level']=$level;                 $arr[]=$v;                 $this->getcate3($data,$v['id'],$level+1);             }         }         return $arr; }

4. 使用变量引用的方式

[danger]使用变量使用的方式时,是不需要返回值的。 因为使用传址方式时,传入的最后的一个$arr其实是一个内存地址,也就是说getcates函数中使用的$arr和调用函数时传入的最后一个参数变量 $newarr,他们是共用一块内存地址的,所以在getcates函数内部写入$arr中的数据,其实是写到了内存,因为$arr和$newarr是共用内存,所以说外部的$newarr会同步变化。

/** *$data 全部的分类数据 *$pid 上级分类id 默认为 0(顶级分类) *$level 层级关系 默认为0(顶级分类) *$&arr 存储最终的数据,传址 **/ public function getcates($data,$pid=0,$level=0,&$arr=[]){         foreach($data as $v){             if($v['pid']==$pid){                 $v['level']=$level;                 $arr[]=$v;                 $this->getcate4($data,$v['id'],$level+1,$arr);             }         } } //在这里要注意,使用这种方式时,在调用时应该这样使用 $this->getates($data,0,0,$newarr); dump($newarr);//$newarr中的数据就是重新排序后的分类数据。

小结

以上给出了四种实现无限级分类的方法,其基本原理都是一样的。在使时,可以根据实际情况,选择使用,并且要根据实际情况,做出相应的调整。


分享到
  • 微信好友
  • QQ好友
  • QQ空间
  • 腾讯微博
  • 新浪微博
  • 人人网