襄陽網站建設開發(fā):thinkphp無限級分類的實現方法(讀?。?/h2>
[success]這里是無限級分類的重點,也是難點,下面會給出幾種方法來這現無限級分類,在這里咱們會把無限級分類的讀取的方法放在模型(/admin/model/Category.php)中。
[danger]無論使用何種方法進行無限級分類的讀到,原理都是一樣的。
[success]# 原理:把數據庫中的分類信息按照一定的規(guī)律重新排序,然后返回重新排序后的數據。
要實現以上功能,需要解決如下問題:
1. 按照一定規(guī)律重新排序
[danger]例如:給出一個頂級分類,要實現以上功能,需要把該頂目分類下的所以子分類,以及子分類的子分,全部找出來,標記出所以子分類的父子關系,然后把們按照父子關系順序排列在一起。 在這里會使用遞歸來循環(huán)判斷是否是其子分類,如果是就記錄下來(在這里需要用到一個固定的容器入放置該結果)。
2. 放置結果的“固定容器”
[danger]能夠在這里使用的固定容器,需要具備以下特點:
在整個程序執(zhí)行過程中,不會重置容易中的內容,也就是說容器是只進不出的。一般會使用全局變量
或者靜態(tài)變量
等來做為“容器”。
也可以使用普通變量,但是每次改變變量的值時,都要保留變量原有的數據。
3. 父子關系的層級顯示
[danger]最終獲取的數據,要能體現分類的層級關系 在這里會用一個變量來記錄每一個分類的層級關系。
無限級分類的讀取方法(難點)
[info]在這里會通過幾種方法來實現無限級分類的讀取。
在這里把分類表中的所以分類數據存儲到$data中,下面的分類信息都從這里來獲取。
1. 普通變量的方式
[danger]要保證,變量的值是最新的完整的數據。在這里會用到數據的合并,這樣是為了每次執(zhí)行后,把變量中的原數據進行保留。
/** *$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. 靜態(tài)變量的方式
[danger]使用這種方式時,不需要進行數組的合并,因為靜態(tài)變量在程序執(zhí)行過程中,不會清楚原有數據,所以只需要把符合條件的直接加入即可。
/** *$data 全部的分類數據 *$pid 上級分類id 默認為 0(頂級分類) *$level 層級關系 默認為0(頂級分類) **/ public function getcates($data,$pid=0,$level=0){ static $arr=array();//定義一個靜態(tài)變量,這里是重點 foreach($data as $v){ if($v['pid']==$pid){ $v['level']=$level; $arr[]=$v; $this->getcate2($data,$v['id'],$level+1); } } return $arr; }
3. 全局變量的方式
[danger]全局變量和靜態(tài)變理的原理一下,只是定義變量的方式不同
/** *$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中的數據就是重新排序后的分類數據。
小結
以上給出了四種實現無限級分類的方法,其基本原理都是一樣的。在使時,可以根據實際情況,選擇使用,并且要根據實際情況,做出相應的調整。
[success]這里是無限級分類的重點,也是難點,下面會給出幾種方法來這現無限級分類,在這里咱們會把無限級分類的讀取的方法放在模型(/admin/model/Category.php)中。
[danger]無論使用何種方法進行無限級分類的讀到,原理都是一樣的。
[success]# 原理:把數據庫中的分類信息按照一定的規(guī)律重新排序,然后返回重新排序后的數據。
要實現以上功能,需要解決如下問題:
1. 按照一定規(guī)律重新排序
[danger]例如:給出一個頂級分類,要實現以上功能,需要把該頂目分類下的所以子分類,以及子分類的子分,全部找出來,標記出所以子分類的父子關系,然后把們按照父子關系順序排列在一起。 在這里會使用遞歸來循環(huán)判斷是否是其子分類,如果是就記錄下來(在這里需要用到一個固定的容器入放置該結果)。
2. 放置結果的“固定容器”
[danger]能夠在這里使用的固定容器,需要具備以下特點:
在整個程序執(zhí)行過程中,不會重置容易中的內容,也就是說容器是只進不出的。一般會使用
全局變量
或者靜態(tài)變量
等來做為“容器”。也可以使用普通變量,但是每次改變變量的值時,都要保留變量原有的數據。
3. 父子關系的層級顯示
[danger]最終獲取的數據,要能體現分類的層級關系 在這里會用一個變量來記錄每一個分類的層級關系。
無限級分類的讀取方法(難點)
[info]在這里會通過幾種方法來實現無限級分類的讀取。
在這里把分類表中的所以分類數據存儲到$data中,下面的分類信息都從這里來獲取。
1. 普通變量的方式
[danger]要保證,變量的值是最新的完整的數據。在這里會用到數據的合并,這樣是為了每次執(zhí)行后,把變量中的原數據進行保留。
/** *$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. 靜態(tài)變量的方式
[danger]使用這種方式時,不需要進行數組的合并,因為靜態(tài)變量在程序執(zhí)行過程中,不會清楚原有數據,所以只需要把符合條件的直接加入即可。
/** *$data 全部的分類數據 *$pid 上級分類id 默認為 0(頂級分類) *$level 層級關系 默認為0(頂級分類) **/ public function getcates($data,$pid=0,$level=0){ static $arr=array();//定義一個靜態(tài)變量,這里是重點 foreach($data as $v){ if($v['pid']==$pid){ $v['level']=$level; $arr[]=$v; $this->getcate2($data,$v['id'],$level+1); } } return $arr; }
3. 全局變量的方式
[danger]全局變量和靜態(tài)變理的原理一下,只是定義變量的方式不同
/** *$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中的數據就是重新排序后的分類數據。
小結
以上給出了四種實現無限級分類的方法,其基本原理都是一樣的。在使時,可以根據實際情況,選擇使用,并且要根據實際情況,做出相應的調整。