建站學(xué)堂

襄陽網(wǎng)站建設(shè)開發(fā):thinkphp無限級分類的實現(xiàn)方法(讀取)

建站學(xué)堂

2602

字體:

[success]這里是無限級分類的重點,也是難點,下面會給出幾種方法來這現(xiàn)無限級分類,在這里咱們會把無限級分類的讀取的方法放在模型(/admin/model/Category.php)中。

[danger]無論使用何種方法進(jìn)行無限級分類的讀到,原理都是一樣的。

[success]# 原理:把數(shù)據(jù)庫中的分類信息按照一定的規(guī)律重新排序,然后返回重新排序后的數(shù)據(jù)。

要實現(xiàn)以上功能,需要解決如下問題:

1. 按照一定規(guī)律重新排序

[danger]例如:給出一個頂級分類,要實現(xiàn)以上功能,需要把該頂目分類下的所以子分類,以及子分類的子分,全部找出來,標(biāo)記出所以子分類的父子關(guān)系,然后把們按照父子關(guān)系順序排列在一起。  在這里會使用遞歸來循環(huán)判斷是否是其子分類,如果是就記錄下來(在這里需要用到一個固定的容器入放置該結(jié)果)。

2. 放置結(jié)果的“固定容器”

[danger]能夠在這里使用的固定容器,需要具備以下特點:

  1. 在整個程序執(zhí)行過程中,不會重置容易中的內(nèi)容,也就是說容器是只進(jìn)不出的。一般會使用全局變量或者靜態(tài)變量等來做為“容器”。

  2. 也可以使用普通變量,但是每次改變變量的值時,都要保留變量原有的數(shù)據(jù)。

3. 父子關(guān)系的層級顯示

[danger]最終獲取的數(shù)據(jù),要能體現(xiàn)分類的層級關(guān)系 在這里會用一個變量來記錄每一個分類的層級關(guān)系。

無限級分類的讀取方法(難點)

[info]在這里會通過幾種方法來實現(xiàn)無限級分類的讀取。

在這里把分類表中的所以分類數(shù)據(jù)存儲到$data中,下面的分類信息都從這里來獲取。

1. 普通變量的方式

[danger]要保證,變量的值是最新的完整的數(shù)據(jù)。在這里會用到數(shù)據(jù)的合并,這樣是為了每次執(zhí)行后,把變量中的原數(shù)據(jù)進(jìn)行保留。

/** *$data 全部的分類數(shù)據(jù) *$pid 上級分類id 默認(rèn)為 0(頂級分類) *$level 層級關(guān)系 默認(rèn)為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);//數(shù)據(jù)的合并,這里是重點             }         }         return $arr; }

2. 靜態(tài)變量的方式

[danger]使用這種方式時,不需要進(jìn)行數(shù)組的合并,因為靜態(tài)變量在程序執(zhí)行過程中,不會清楚原有數(shù)據(jù),所以只需要把符合條件的直接加入即可。

/** *$data 全部的分類數(shù)據(jù) *$pid 上級分類id 默認(rèn)為 0(頂級分類) *$level 層級關(guān)系 默認(rèn)為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 全部的分類數(shù)據(jù) *$pid 上級分類id 默認(rèn)為 0(頂級分類) *$level 層級關(guān)系 默認(rèn)為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其實是一個內(nèi)存地址,也就是說getcates函數(shù)中使用的$arr和調(diào)用函數(shù)時傳入的最后一個參數(shù)變量 $newarr,他們是共用一塊內(nèi)存地址的,所以在getcates函數(shù)內(nèi)部寫入$arr中的數(shù)據(jù),其實是寫到了內(nèi)存,因為$arr和$newarr是共用內(nèi)存,所以說外部的$newarr會同步變化。

/** *$data 全部的分類數(shù)據(jù) *$pid 上級分類id 默認(rèn)為 0(頂級分類) *$level 層級關(guān)系 默認(rèn)為0(頂級分類) *$&arr 存儲最終的數(shù)據(jù),傳址 **/ 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);             }         } } //在這里要注意,使用這種方式時,在調(diào)用時應(yīng)該這樣使用 $this->getates($data,0,0,$newarr); dump($newarr);//$newarr中的數(shù)據(jù)就是重新排序后的分類數(shù)據(jù)。

小結(jié)

以上給出了四種實現(xiàn)無限級分類的方法,其基本原理都是一樣的。在使時,可以根據(jù)實際情況,選擇使用,并且要根據(jù)實際情況,做出相應(yīng)的調(diào)整。


[聲明]原創(chuàng)不易,請轉(zhuǎn)發(fā)者備注下文章來源(hbsjsd.cn)【速建時代】。