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

2021-07-25 19:24:45 字數 1922 閱讀 6999

方案一:

表結構:

id int primary key auto_increment;

name varchar(40);

pid int default 0; #父類id,預設值為0

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

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

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

方案二:

在表字段中增加乙個 path 字段

id int primary key auto_increment;

name varchar(40);

pid int default 0; #父類id,預設值為0

path varchar(255); #記錄從根分類到父類的路徑,eg:0-1-5,數字是id

示例資料:

id        name        pid        path

1         電腦         0           0

2         手機         0           0

3         筆記本     1           0-1

4         超級本     3           0-1-3

5         遊戲本     3           0-1-3

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

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

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

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

方案一的樣例**:

<?php

$addrs = array(

array('id'=>1, 'name'=>'中國', 'pid'=>0),

array('id'=>2, 'name'=>'河南', 'pid'=>1),

array('id'=>3, 'name'=>'鄭州', 'pid'=>2),

array('id'=>4, 'name'=>'洛陽', 'pid'=>2),

array('id'=>5, 'name'=>'安陽', 'pid'=>2),

array('id'=>6, 'name'=>'林州', 'pid'=>5),

array('id'=>7, 'name'=>'安陽縣', 'pid'=>5),

array('id'=>8, 'name'=>'內黃', 'pid'=>5),

array('id'=>9, 'name'=>'滑縣', 'pid'=>5),

array('id'=>10, 'name'=>'城郊鄉', 'pid'=>6),

array('id'=>11, 'name'=>'湖南', 'pid'=>1),

array('id'=>12, 'name'=>'長沙', 'pid'=>11),

array('id'=>13, 'name'=>'湘潭', 'pid'=>11),

array('id'=>14, 'name'=>'岳麓區', 'pid'=>12), );

// 查詢子樹

function get_childs($id)

} return $ret; }

// test code

echo '';

print_r( get_childs(1) );

echo '';

print_r($addrs);

無限級分類

相信在實際專案中很多人在做專案的時候都會用到無限級分類,無限級分類說白了就是乙個遞迴,遞迴在我們的專案開發中起到很重要的作用,如 麵包屑導航等。下面我們演示乙個遞迴的案例 area array array id 1,name 安徽 parent 0 array id 2,name 海淀 parent...

無限級分類

無限極分類其實就是乙個遞迴便利 1,查詢所有資料 namespace home controller use think controller class indexcontroller extends controller 2,遞迴便利資料 namespace home model use thi...

無限級分類

將資料如下輸出 上海 青浦 浦東 張江 北京 昌平 data res def get son data,level 0,parent id 0 for item in data 如果當前迴圈的parent id parent id,將level等級新增到列表中 if item parent id p...