解析實(shí)現(xiàn)PHP+Mysql無(wú)限分類的方法匯總
2018-02-09 14:06:03
1548瀏覽
在現(xiàn)如今,隨著IT互聯(lián)網(wǎng)開(kāi)發(fā)技術(shù)飛速的發(fā)展和進(jìn)步,相信很多PHP開(kāi)發(fā)程序員聽(tīng)說(shuō)過(guò)無(wú)限分類這個(gè)話題,那么下面我們來(lái)看看PHP結(jié)合Mysql如何實(shí)現(xiàn)。
第一種方法
這種方法是很常見(jiàn)、很傳統(tǒng)的一種,先看表結(jié)構(gòu)
表:category
idint主鍵,自增
namevarchar分類名稱
pidint父類id,默認(rèn)0
頂級(jí)分類的pid默認(rèn)就是0了。當(dāng)我們想取出某個(gè)分類的子分類樹(shù)的時(shí)候,基本思路就是遞歸,當(dāng)然,出于效率問(wèn)題不建議每次遞歸都查詢數(shù)據(jù)庫(kù),通常的做法是先講所有分類取出來(lái),保存到PHP數(shù)組里,再進(jìn)行處理,最后還可以將結(jié)果緩存起來(lái)以提高下次請(qǐng)求的效率。
先來(lái)構(gòu)建一個(gè)原始數(shù)組,這個(gè)直接從數(shù)據(jù)庫(kù)中拉出來(lái)就行:
復(fù)制代碼代碼如下:
$categories=array(
array('id'=>1,'name'=>'電腦','pid'=>0),
array('id'=>2,'name'=>'手機(jī)','pid'=>0),
array('id'=>3,'name'=>'筆記本','pid'=>1),
array('id'=>4,'name'=>'臺(tái)式機(jī)','pid'=>1),
array('id'=>5,'name'=>'智能機(jī)','pid'=>2),
array('id'=>6,'name'=>'功能機(jī)','pid'=>2),
array('id'=>7,'name'=>'超級(jí)本','pid'=>3),
array('id'=>8,'name'=>'游戲本','pid'=>3),
);
目標(biāo)是將它轉(zhuǎn)化為下面這種結(jié)構(gòu)
電腦
筆記本
超級(jí)本
游戲本
臺(tái)式機(jī)
手機(jī)
智能機(jī)
功能機(jī)
用數(shù)組來(lái)表示的話,可以增加一個(gè)children鍵來(lái)存儲(chǔ)它的子分類:
復(fù)制代碼代碼如下:
array(
//1對(duì)應(yīng)id,方便直接讀取
1=>array(
'id'=>1,
'name'=>'電腦',
'pid'=>0,
children=>array(
&array(
'id'=>3,
'name'=>'筆記本',
'pid'=>1,
'children'=>array(
//此處省略
)
),
&array(
'id'=>4,
'name'=>'臺(tái)式機(jī)',
'pid'=>1,
'children'=>array(
//此處省略
)
),
)
),
//其他分類省略
)
處理過(guò)程:
復(fù)制代碼代碼如下:
$tree=array();
//第一步,將分類id作為數(shù)組key,并創(chuàng)建children單元
foreach($categoriesas$category){
$tree[$category['id']]=$category;
$tree[$category['id']]['children']=array();
}
//第二部,利用引用,將每個(gè)分類添加到父類children數(shù)組中,這樣一次遍歷即可形成樹(shù)形結(jié)構(gòu)。
foreach($treeas$k=>$item){
if($item['pid']!=0){
$tree[$item['pid']]['children'][]=&$tree[$k];
}
}
print_r($tree);
打印結(jié)果如下:
復(fù)制代碼代碼如下:
Array
(
[1]=>Array
(
[id]=>1
[name]=>電腦
[pid]=>0
[children]=>Array
(
[0]=>Array
(
[id]=>3
[name]=>筆記本
[pid]=>1
[children]=>Array
(
[0]=>Array
(
[id]=>7
[name]=>超級(jí)本
[pid]=>3
[children]=>Array
(
)
)
[1]=>Array
(
[id]=>8
[name]=>游戲本
[pid]=>3
[children]=>Array
(
)
)
)
)
[1]=>Array
(
[id]=>4
[name]=>臺(tái)式機(jī)
[pid]=>1
[children]=>Array
(
)
)
)
)
[2]=>Array
(
[id]=>2
[name]=>手機(jī)
[pid]=>0
[children]=>Array
(
[0]=>Array
(
[id]=>5
[name]=>智能機(jī)
[pid]=>2
[children]=>Array
(
)
)
[1]=>Array
(
[id]=>6
[name]=>功能機(jī)
[pid]=>2
[children]=>Array
(
)
)
)
)
[3]=>Array
(
[id]=>3
[name]=>筆記本
[pid]=>1
[children]=>Array
(
[0]=>Array
(
[id]=>7
[name]=>超級(jí)本
[pid]=>3
[children]=>Array
(
)
)
[1]=>Array
(
[id]=>8
[name]=>游戲本
[pid]=>3
[children]=>Array
(
)
)
)
)
[4]=>Array
(
[id]=>4
[name]=>臺(tái)式機(jī)
[pid]=>1
[children]=>Array
(
)
)
[5]=>Array
(
[id]=>5
[name]=>智能機(jī)
[pid]=>2
[children]=>Array
(
)
)
[6]=>Array
(
[id]=>6
[name]=>功能機(jī)
[pid]=>2
[children]=>Array
(
)
)
[7]=>Array
(
[id]=>7
[name]=>超級(jí)本
[pid]=>3
[children]=>Array
(
)
)
[8]=>Array
(
[id]=>8
[name]=>游戲本
[pid]=>3
[children]=>Array
(
)
)
)
優(yōu)點(diǎn):關(guān)系清楚,修改上下級(jí)關(guān)系簡(jiǎn)單。
缺點(diǎn):使用PHP處理,如果分類數(shù)量龐大,效率也會(huì)降低。
第二種方法
這種方法是在表字段中增加一個(gè)path字段:
表:category
idint主鍵,自增
namevarchar分類名稱
pidint父類id,默認(rèn)0
pathvarchar路徑
示例數(shù)據(jù):
idnamepidpath
1電腦00
2手機(jī)00
3筆記本10-1
4超級(jí)本30-1-3
5游戲本30-1-3
path字段記錄了從根分類到上一級(jí)父類的路徑,用id+'-'表示。
這種方式,假設(shè)我們要查詢電腦下的所有后代分類,只需要一條sql語(yǔ)句:
selectid,name,pathfromcategorywherepathlike(selectconcat(path,'-',id,'%')aspathfromcategorywhereid=1);
結(jié)果:
+----+-----------+-------+
|id|name|path|
+----+-----------+-------+
|3|筆記本|0-1|
|4|超級(jí)本|0-1-3|
|5|游戲本|0-1-3|
+----+-----------+-------+
以上就是關(guān)于扣丁學(xué)堂PHP培訓(xùn)之解析實(shí)現(xiàn)PHP+Mysql無(wú)限分類的方法匯總的詳細(xì)介紹最后想要了解更多關(guān)于PHP開(kāi)發(fā)發(fā)展前景趨勢(shì),請(qǐng)關(guān)注扣丁學(xué)堂官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺(tái)為您提供權(quán)威的PHP視頻教程系統(tǒng),通過(guò)千鋒扣丁學(xué)堂金牌講師在線錄制的一套PHP視頻教程課程,讓你快速掌握PHP從入門(mén)到精通開(kāi)發(fā)實(shí)戰(zhàn)技能??鄱W(xué)堂PHP開(kāi)發(fā)工程師技術(shù)交流群:374332265。
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>
標(biāo)簽:
PHP培訓(xùn)
PHP視頻教程
PHP從入門(mén)到精通
PHP學(xué)習(xí)路線圖
PHP開(kāi)發(fā)工程師