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

無限分類是個老話題了糠赦,來看看PHP結(jié)合Mysql如何實現(xiàn)蜡娶。

第一種方法

這種方法是很常見欣硼、很傳統(tǒng)的一種题翰,先看表結(jié)構(gòu)

表:category

id int 主鍵,自增
name varchar 分類名稱
pid int 父類id,默認0

頂級分類的 pid 默認就是0了诈胜。當我們想取出某個分類的子分類樹的時候豹障,基本思路就是遞歸,當然耘斩,出于效率問題不建議每次遞歸都查詢數(shù)據(jù)庫沼填,通常的做法是先將所有分類取出來,保存到PHP數(shù)組里括授,再進行處理,最后還可以將結(jié)果緩存起來以提高下次請求的效率。

先來構(gòu)建一個原始數(shù)組荚虚,這個直接從數(shù)據(jù)庫中拉出來就行:

代碼如下:

$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),
);

目標是將它轉(zhuǎn)化為下面這種結(jié)構(gòu)

電腦
    筆記本
        超級本
        游戲本
    臺式機
手機
    智能機
    功能機

用數(shù)組來表示的話薛夜,可以增加一個 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作為數(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é)果如下:

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
                (
                )
        )
)

優(yōu)點:關系清楚,修改上下級關系簡單俭茧。

缺點:使用PHP處理咆疗,如果分類數(shù)量龐大,效率也會降低母债。

第二種方法

這種方法是在表字段中增加一個path字段:

表:category

id int 主鍵,自增

name varchar 分類名稱

pid int 父類id午磁,默認0

path varchar 路徑

示例數(shù)據(jù):

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);

結(jié)果:

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

| id | name      | path  |

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

| 3  | 筆記本 | 0-1   |

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

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

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

這種方式也被很多人所采納衙熔,我總結(jié)了下:

優(yōu)點:查詢?nèi)菀椎峭牵矢撸琾ath字段可以加索引红氯。

缺點:更新節(jié)點關系麻煩框咙,需要更新所有后輩的path字段。

以上就是本文的全部內(nèi)容了脖隶,兩種方式扁耐,你喜歡哪種?希望大家能夠喜歡产阱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末婉称,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子构蹬,更是在濱河造成了極大的恐慌王暗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庄敛,死亡現(xiàn)場離奇詭異俗壹,居然都是意外死亡,警方通過查閱死者的電腦和手機藻烤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門绷雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头滔,“玉大人,你說我怎么就攤上這事涎显±ぜ欤” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵期吓,是天一觀的道長早歇。 經(jīng)常有香客問我,道長讨勤,這世上最難降的妖魔是什么箭跳? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮潭千,結(jié)果婚禮上谱姓,老公的妹妹穿的比我還像新娘。我一直安慰自己脊岳,他們只是感情好逝段,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著割捅,像睡著了一般奶躯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亿驾,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天嘹黔,我揣著相機與錄音,去河邊找鬼莫瞬。 笑死儡蔓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的疼邀。 我是一名探鬼主播喂江,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旁振!你這毒婦竟也來了获询?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拐袜,失蹤者是張志新(化名)和其女友劉穎吉嚣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹬铺,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡尝哆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜攀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秋泄。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡琐馆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出印衔,到底是詐尸還是另有隱情啡捶,我是刑警寧澤姥敛,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布奸焙,位于F島的核電站,受9級特大地震影響彤敛,放射性物質(zhì)發(fā)生泄漏与帆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一墨榄、第九天 我趴在偏房一處隱蔽的房頂上張望玄糟。 院中可真熱鬧,春花似錦袄秩、人聲如沸阵翎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郭卫。三九已至,卻和暖如春背稼,著一層夾襖步出監(jiān)牢的瞬間贰军,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工蟹肘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留词疼,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓帘腹,卻偏偏與公主長得像贰盗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阳欲,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • php面試題及答案(轉(zhuǎn)載)收藏 基礎題: 1.表單中 get與post提交方法的區(qū)別? 答:get是發(fā)送請求HTT...
    積_漸閱讀 1,642評論 0 37
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口閱讀 15,696評論 0 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理舵盈,服務發(fā)現(xiàn),斷路器胸完,智...
    卡卡羅2017閱讀 134,696評論 18 139
  • 隊長把我們十二個人進行了人員安排书释,每兩個隊員組成一個小組,小組里的成員一個負責拍照赊窥,一個負責向公園里的人們就行調(diào)查...
    水淺則無魚閱讀 173評論 0 0
  • 嫂子嫁給我哥那年爆惧,我十五歲。我后邊還有個妹妹十一歲锨能,堂妹一個四歲扯再,一個三歲芍耘,堂弟一歲。一過年嫂子生下一個兒子熄阻,第二...
    A寒秋閱讀 819評論 34 12