實現PHP Mysql無限分類的方法彙總

2021-06-28 22:04:10 字數 4393 閱讀 6910

無限分類是個老話題了,來看看php結合mysql如何實現。

第一種方法

這種方法是很常見、很傳統的一種,先看錶結構

表:category

id int 主鍵,自增

name varchar 分類名稱

pid int 父類id,預設0

頂級分類的 pid 預設就是0了。當我們想取出某個分類的子分類樹的時候,基本思路就是遞迴,當然,出於效率問題不建議每次遞迴都查詢資料庫,通常的做法是先講所有分類取出來,儲存到php陣列裡,再進行處理,最後還可以將結果快取起來以提高下次請求的效率。

先來構建乙個原始陣列,這個直接從資料庫中拉出來就行:

$categories = array(

array('id'=>1,'name'=>'電腦','pid'=>0),

array('id'=>2,'name'=>'手機','pid'=>0),

array('id'=>3,'name'=>'筆記本','pid'=>1),

array('id'=>4,'name'=>'台式電腦','pid'=>1),

array('id'=>5,'name'=>'智慧型機','pid'=>2),

array('id'=>6,'name'=>'功能機','pid'=>2),

array('id'=>7,'name'=>'超級本','pid'=>3),

array('id'=>8,'name'=>'遊戲本','pid'=>3),

);

目標是將它轉化為下面這種結構

電腦筆記本

超級本遊戲本

台式電腦手機

智慧型機功能機

用陣列來表示的話,可以增加乙個 children 鍵來儲存它的子分類:

array(

//1對應id,方便直接讀取

1 => array(

'id'=>1,

'name'=>'電腦',

'pid'=>0,

children=>array(

&array(

'id'=>3,

'name'=>'筆記本',

'pid'=>1,

'children'=>array(

//此處省略)),

&array(

'id'=>4,

'name'=>'台式電腦',

'pid'=>1,

'children'=>array(

//此處省略)),

)),

//其他分類省略

)

處理過程:

$tree = array();

//第一步,將分類id作為陣列key,並建立children單元

foreach($categories as $category)

//第二部,利用引用,將每個分類新增到父類children陣列中,這樣一次遍歷即可形成樹形結構。

foreach ($tree as $k=>$item)

}print_r($tree);

array

( [1] => array

([id] => 1

[name] => 電腦

[pid] => 0

[children] => array

([0] => array

([id] => 3

[name] => 筆記本

[pid] => 1

[children] => array

([0] => array

([id] => 7

[name] => 超級本

[pid] => 3

[children] => array()

)[1] => array

([id] => 8

[name] => 遊戲本

[pid] => 3

[children] => array()

))

)[1] => array

([id] => 4

[name] => 台式電腦

[pid] => 1

[children] => array()

))

)[2] => array

([id] => 2

[name] => 手機

[pid] => 0

[children] => array

([0] => array

([id] => 5

[name] => 智慧型機

[pid] => 2

[children] => array()

)[1] => array

([id] => 6

[name] => 功能機

[pid] => 2

[children] => array()

))

)[3] => array

([id] => 3

[name] => 筆記本

[pid] => 1

[children] => array

([0] => array

([id] => 7

[name] => 超級本

[pid] => 3

[children] => array()

)[1] => array

([id] => 8

[name] => 遊戲本

[pid] => 3

[children] => array()

))

)[4] => array

([id] => 4

[name] => 台式電腦

[pid] => 1

[children] => array()

)[5] => array

([id] => 5

[name] => 智慧型機

[pid] => 2

[children] => array()

)[6] => array

([id] => 6

[name] => 功能機

[pid] => 2

[children] => array()

)[7] => array

([id] => 7

[name] => 超級本

[pid] => 3

[children] => array()

)[8] => array

([id] => 8

[name] => 遊戲本

[pid] => 3

[children] => array()

))

優點:關係清楚,修改上下級關係簡單。

缺點:使用php處理,如果分類數量龐大,效率也會降低。

第二種方法

這種方法是在表字段中增加乙個path欄位:

表:category

id int 主鍵,自增

name varchar 分類名稱

pid int 父類id,預設0

path varchar 路徑

示例資料:

id        name        pid        path

1         電腦        0          0

2         手機        0          0

3         筆記本      1          0-1

4         超級本      3          0-1-3

5         遊戲本      3          0-1-3

path欄位記錄了從根分類到上一級父類的路徑,用id+'-'表示。

這種方式,假設我們要查詢電腦下的所有後代分類,只需要一條sql語句:

select id,name,path from category where path like (select concat(path,'-',id,'%') as path from category where id=1);

結果:+----+-----------+-------+

| id | name      | path  |

+----+-----------+-------+

| 3  | 筆記本 | 0-1   |

| 4  | 超級本 | 0-1-3 |

| 5  | 遊戲本 | 0-1-3 |

+----+-----------+-------+

這種方式也被很多人所採納,我總結了下:

優點:查詢容易,效率高,path欄位可以加索引。

缺點:更新節點關係麻煩,需要更新所有後輩的path欄位。

以上就是本文的全部內容了,兩種方式,你喜歡哪種?希望大家能夠喜歡。

PHP MySQL 無限級分類的兩種實現方案

方案一 表結構 id int primary key auto increment name varchar 40 pid int default 0 父類id,預設值為0 頂級分類的 pid 預設就是0了。當我們想取出某個分類的子分類樹的時候,基本思路就是遞迴,當然,出於效率問題不建議每次遞迴都查...

無限級分類的實現

在我們做 的時候,不管是新聞系統還是產品系統,或者是部落格,論壇等等,都少不了與分類打交道。有時候我們經常說分幾級分類,一般分2 3級,具體視情況而定,但是這樣的做法非常死板,不夠靈活,因為不是任何類別下的分類都有子類,孫類 為了能夠使分類靈活,我們經常採用的是無限級分類。無限級分類主要思路有兩種 ...

php實現無限分類

access public param pid 節點的id param array 返回該節點的所有後代節點 public function list cate pid 0 access private param arr array 要遍歷的陣列 param pid 節點的pid,預設為0,表示從...