文章来源(hbsjsd.cn)湖北高端网站定制开发公司-速建时代
[success]这里是无限级分类的重点,也是难点,下面会给出几种方法来这现无限级分类,在这里咱们会把无限级分类的读取的方法放在模型(/admin/model/Category.php)中。
[danger]无论使用何种方法进行无限级分类的读到,原理都是一样的。
[success]# 原理:把数据库中的分类信息按照一定的规律重新排序,然后返回重新排序后的数据。
要实现以上功能,需要解决如下问题:
1. 按照一定规律重新排序
[danger]例如:给出一个顶级分类,要实现以上功能,需要把该顶目分类下的所以子分类,以及子分类的子分,全部找出来,标记出所以子分类的父子关系,然后把们按照父子关系顺序排列在一起。 在这里会使用递归来循环判断是否是其子分类,如果是就记录下来(在这里需要用到一个固定的容器入放置该结果)。
2. 放置结果的“固定容器”
[danger]能够在这里使用的固定容器,需要具备以下特点:
在整个程序执行过程中,不会重置容易中的内容,也就是说容器是只进不出的。一般会使用
全局变量
或者静态变量
等来做为“容器”。也可以使用普通变量,但是每次改变变量的值时,都要保留变量原有的数据。
3. 父子关系的层级显示
[danger]最终获取的数据,要能体现分类的层级关系 在这里会用一个变量来记录每一个分类的层级关系。
[info]在这里会通过几种方法来实现无限级分类的读取。
[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; }
[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; }
[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; }
[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中的数据就是重新排序后的分类数据。
以上给出了四种实现无限级分类的方法,其基本原理都是一样的。在使时,可以根据实际情况,选择使用,并且要根据实际情况,做出相应的调整。
[声明]原创不易,请转发者备注下文章来源(hbsjsd.cn)【速建时代】。