您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP+MySQL中的無限分類方法有哪些”,在日常操作中,相信很多人在PHP+MySQL中的無限分類方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP+MySQL中的無限分類方法有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
第一種方法
這種方法是很常見、很傳統的一種,先看表結構
表:category
idint主鍵,自增
namevarchar分類名稱
pidint父類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($categoriesas$category){
$tree[$category['id']]=$category;
$tree[$category['id']]['children']=array();
}
//第二部,利用引用,將每個分類添加到父類children數組中,這樣一次遍歷即可形成樹形結構。
foreach($treeas$k=>$item){
if($item['pid']!=0){
$tree[$item['pid']]['children'][]=&$tree[$k];
}
}
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處理,假如分類數量龐大,效率也會降低。
PHP+MySQL無限分類有哪些方法
第二種方法
這種方法是在表字段中增加一個path字段:
表:category
idint主鍵,自增
namevarchar分類名稱
pidint父類id,默認0
pathvarchar路徑
示例數據:
idnamepidpath
1電腦00
2手機00
3筆記本10-1
4超級本30-1-3
5游戲本30-1-3
path字段記錄了從根分類到上一級父類的路徑,用id+’-'表示。
這種方式,假設大家要查詢電腦下的所有后代分類,只需要一條sql語句:
selectid,name,pathfromcategorywherepathlike(selectconcat(path,’-',id,’%')aspathfromcategorywhereid=1);
結果:
+—-+———–+——-+
|id|name|path|
+—-+———–+——-+
|3|筆記本|0-1|
|4|超級本|0-1-3|
|5|游戲本|0-1-3|
+—-+———–+——-+
這種方式也被很多人所采納,我總結了下:
優點:查詢容易,效率高,path字段可以加索引。
缺點:更新節點關系麻煩,需要更新所有后輩的path字段。
到此,關于“PHP+MySQL中的無限分類方法有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。