新聞動態

                                                                                  位置:首頁 新聞動態 建站學堂

                                                                                  襄陽網站建設開發:thinkphp無限級分類的實現方法(讀?。?/h2>
                                                                                  新聞動態
                                                                                  2020年04月13日 閱讀:2936次

                                                                                  [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中的數據就是重新排序后的分類數據。

                                                                                  小結

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

                                                                                  上一篇

                                                                                  下一篇

                                                                                  亚洲中文字幕在线19页_99久久国产精品免费热7788_欧美专区日韩专区综合专区_小泽玛利亚一区_gogo999亚洲肉体艺术