国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

實現(xiàn)PHP+Mysql無限分類的方法匯總

2020-03-22 17:25:07
字體:
供稿:網(wǎng)友
pid int 父類id,默認(rèn)0
頂級分類的 pid 默認(rèn)就是0了。當(dāng)我們想取出某個分類的子分類樹的時候,基本思路就是遞歸,當(dāng)然,出于效率問題不建議每次遞歸都查詢數(shù)據(jù)庫,通常的做法是先講所有分類取出來,保存到PHP數(shù)組里,再進(jìn)行處理,最后還可以將結(jié)果緩存起來以提高下次請求的效率。先來構(gòu)建一個原始數(shù)組,這個直接從數(shù)據(jù)庫中拉出來就行:復(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'= '臺式機(jī)','pid'= 1),
array('id'= 5,'name'= '智能機(jī)','pid'= 2),
array('id'= 6,'name'= '功能機(jī)','pid'= 2),
array('id'= 7,'name'= '超級本','pid'= 3),
array('id'= 8,'name'= '游戲本','pid'= 3),
);
目標(biāo)是將它轉(zhuǎn)化為下面這種結(jié)構(gòu)電腦
筆記本
超級本
游戲本
臺式機(jī)
手機(jī)
智能機(jī)
功能機(jī)
用數(shù)組來表示的話,可以增加一個 children 鍵來存儲它的子分類:復(fù)制代碼 代碼如下:
array(
//1對應(yīng)id,方便直接讀取
1 = array(
'id'= 1,
'name'= '電腦',
'pid'= 0,
children= array(
&array(
'id'= 3,
'name'= '筆記本',
'pid'= 1,
'children'= array(
//此處省略
)
),
&array(
'id'= 4,
'name'= '臺式機(jī)',
'pid'= 1,
'children'= array(
//此處省略
)
),
)
),
//其他分類省略
)
處理過程:復(fù)制代碼 代碼如下:
$tree = array();
//第一步,將分類id作為數(shù)組key,并創(chuàng)建children單元
foreach($categories as $category){
$tree[$category['id']] = $category;
$tree[$category['id']]['children'] = array();
}
//第二部,利用引用,將每個分類添加到父類children數(shù)組中,這樣一次遍歷即可形成樹形結(jié)構(gòu)。
foreach ($tree as $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] = 超級本
[pid] = 3
[children] = Array
(
)
)
[1] = Array
(
[id] = 8
[name] = 游戲本
[pid] = 3
[children] = Array
(
)
)
)
)
[1] = Array
(
[id] = 4
[name] = 臺式機(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] = 超級本
[pid] = 3
[children] = Array
(
)
)
[1] = Array
(
[id] = 8
[name] = 游戲本
[pid] = 3
[children] = Array
(
)
)
)
)
[4] = Array
(
[id] = 4
[name] = 臺式機(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] = 超級本
[pid] = 3
[children] = Array
(
)
)
[8] = Array
(
[id] = 8
[name] = 游戲本
[pid] = 3
[children] = Array
(
)
)
)
優(yōu)點:關(guān)系清楚,修改上下級關(guān)系簡單。缺點:使用PHP處理,如果分類數(shù)量龐大,效率也會降低。第二種方法這種方法是在表字段中增加一個path字段:表:category
id int 主鍵,自增
name varchar 分類名稱
pid int 父類id,默認(rèn)0
path varchar 路徑
示例數(shù)據(jù):id name pid path
1 電腦 0 0
2 手機(jī) 0 0
3 筆記本 1 0-1
4 超級本 3 0-1-3
5 游戲本 3 0-1-3
path字段記錄了從根分類到上一級父類的路徑,用id+'-'表示。這種方式,假設(shè)我們要查詢電腦下的所有后代分類,只需要一條sql語句:select id,name,path from category where path like (select concat(path,'-',id,'%') as path from category where id=1);
結(jié)果:+----+-----------+-------+
| id | name | path |
+----+-----------+-------+
| 3 | 筆記本 | 0-1 |
| 4 | 超級本 | 0-1-3 |
| 5 | 游戲本 | 0-1-3 |
+----+-----------+-------+
這種方式也被很多人所采納,我總結(jié)了下:優(yōu)點:查詢?nèi)菀祝矢撸琾ath字段可以加索引。缺點:更新節(jié)點關(guān)系麻煩,需要更新所有后輩的path字段。以上就是本文的全部內(nèi)容了,兩種方式,你喜歡哪種?希望大家能夠喜歡。PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 六安市| 蕉岭县| 车致| 屏东县| 马龙县| 蒙阴县| 梁河县| 铜鼓县| 镇沅| 合山市| 景德镇市| 抚松县| 汤阴县| 甘洛县| 遂溪县| 巴东县| 伊吾县| 峡江县| 诸暨市| 壶关县| 五峰| 察雅县| 方正县| 苍梧县| 常熟市| 盐山县| 莲花县| 稻城县| 华容县| 秭归县| 博野县| 台南县| 基隆市| 象州县| 云浮市| 泰来县| 定襄县| 五台县| 阜南县| 达孜县| 威信县|