亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

實現PHP+Mysql無限分類的方法匯總

2024-05-04 23:31:42
字體:
來源:轉載
供稿:網友
這篇文章主要給大家匯總介紹了實現PHP+Mysql無限分類的2種方法,并對比分析了2種方法的優劣,需要的朋友可以參考下
 

無限分類是個老話題了,來看看PHP結合Mysql如何實現。

第一種方法

這種方法是很常見、很傳統的一種,先看表結構

表:category
id int 主鍵,自增
name varchar 分類名稱
pid int 父類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($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,將每個分類添加到父類children數組中,這樣一次遍歷即可形成樹形結構。
foreach ($tree as $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處理,如果分類數量龐大,效率也會降低。

第二種方法

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

表:category
id int 主鍵,自增
name varchar 分類名稱
pid int 父類id,默認0
path varchar 路徑
示例數據:

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);
結果:

+----+-----------+-------+
| id | name      | path  |
+----+-----------+-------+
| 3  | 筆記本 | 0-1   |
| 4  | 超級本 | 0-1-3 |
| 5  | 游戲本 | 0-1-3 |
+----+-----------+-------+
這種方式也被很多人所采納,我總結了下:

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

缺點:更新節點關系麻煩,需要更新所有后輩的path字段。

以上就是本文的全部內容了,兩種方式,你喜歡哪種?希望大家能夠喜歡。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久久| 亚洲一区二区三区毛片| 亚洲国产精品yw在线观看| 国产精品久久久久久久久久99| 欧美人在线视频| 日日骚av一区| 精品成人国产在线观看男人呻吟| 亚洲精品欧美一区二区三区| 国产日韩欧美91| 国产99视频精品免视看7| 久久亚洲精品成人| 亚洲精品视频二区| 久久久久www| 亚洲成在人线av| 亚洲国产精品悠悠久久琪琪| 精品偷拍一区二区三区在线看| 久久久精品2019中文字幕神马| 欧美精品久久久久a| 国产亚洲欧洲在线| 亚洲国产精品电影| 国产一区二中文字幕在线看| 午夜免费在线观看精品视频| 欧美一区三区三区高中清蜜桃| 自拍偷拍亚洲区| 久99九色视频在线观看| 亚洲欧美日韩国产成人| 国产视频久久久久| 欧洲中文字幕国产精品| 国产中文字幕91| 美女撒尿一区二区三区| 中文字幕亚洲情99在线| 欧美电影《睫毛膏》| 在线精品91av| 欧美国产极速在线| 日本亚洲欧洲色α| 国产91在线高潮白浆在线观看| 日韩有码在线观看| 久久香蕉频线观| 国产精品海角社区在线观看| 亚洲欧美国产高清va在线播| 欧美午夜片欧美片在线观看| 日本在线观看天堂男亚洲| 国产日韩欧美夫妻视频在线观看| 狠狠色噜噜狠狠狠狠97| 欧洲精品在线视频| 欧美黄色片在线观看| 成人做爰www免费看视频网站| 亚洲第一区第一页| 欧美精品日韩三级| 久久久久久久国产精品视频| 国产精品夜色7777狼人| 日韩电影中文字幕在线观看| 久久久国产视频| 国产视频综合在线| 国产狼人综合免费视频| 2019中文字幕在线| 麻豆国产va免费精品高清在线| 91综合免费在线| 欧美美最猛性xxxxxx| 色老头一区二区三区在线观看| 国产精品三级美女白浆呻吟| 久久国产精品久久久| 国产一区二区激情| 亚洲精品久久在线| 国产精品黄页免费高清在线观看| 91精品在线观| 国产精品日韩在线播放| 97色在线视频观看| 91亚洲永久免费精品| 亚洲伊人一本大道中文字幕| 国产啪精品视频网站| 国产欧美一区二区三区在线看| 在线日韩av观看| 国产精品国内视频| 超碰97人人做人人爱少妇| 色婷婷亚洲mv天堂mv在影片| 国产精品一区二区三区久久久| 91sa在线看| 欧美午夜激情视频| 日本午夜人人精品| 久久精品亚洲精品| 欧美一级免费看| 中文字幕亚洲一区在线观看| 日韩欧美有码在线| 91精品国产91| 成人疯狂猛交xxx| 欧美一区二区大胆人体摄影专业网站| 欧美激情精品久久久久久黑人| 九九热99久久久国产盗摄| 国产精品久久不能| 亚洲精品电影网站| 欧美精品videosex性欧美| 日韩欧美中文免费| 国产成人精品在线视频| 成人黄色激情网| 成人羞羞国产免费| 国产精品久久久久久av下载红粉| 国产精品wwwwww| 日本道色综合久久影院| 亚洲码在线观看| 美女av一区二区| 亚洲欧美在线一区二区| 中文字幕亚洲一区二区三区五十路| 精品动漫一区二区三区| 国产一区二区三区精品久久久| 日韩欧美999| 亚洲视频第一页| 国产精品久久久| 亚洲美女自拍视频| 亚洲欧美国产高清va在线播| 国产不卡精品视男人的天堂| 国产精品视频一区二区三区四| 日韩在线一区二区三区免费视频| 欧美尺度大的性做爰视频| 久久精品国产91精品亚洲| 亚洲欧美日韩中文在线制服| 国产热re99久久6国产精品| 久久久久久久久久国产| 国产精品自产拍在线观看| 亚洲第一av在线| 亚洲欧美国产高清va在线播| 亚洲精品久久久久中文字幕欢迎你| 国产精品视频久| 懂色av中文一区二区三区天美| 日本精品久久中文字幕佐佐木| 亚洲系列中文字幕| 全球成人中文在线| 欧美尤物巨大精品爽| 黄色成人在线播放| 国产成人亚洲综合青青| 精品视频久久久| 欧美午夜性色大片在线观看| 欧美一级大片视频| 国内精品中文字幕| 国产色婷婷国产综合在线理论片a| 国产精品露脸自拍| 成人信息集中地欧美| 国产日韩欧美视频在线| 91国产高清在线| 国产成+人+综合+亚洲欧美丁香花| 欧美成人免费一级人片100| 欧美猛交ⅹxxx乱大交视频| 中文字幕亚洲无线码a| 午夜精品一区二区三区在线视| 欧美美最猛性xxxxxx| 成人激情视频网| 亚洲三级黄色在线观看| 日韩av电影院| 色哟哟入口国产精品| 欧美黑人一级爽快片淫片高清| 久久久久久久久久久亚洲| 欧美激情中文字幕乱码免费| 欧美孕妇与黑人孕交| 日韩av在线网| 日韩在线视频观看正片免费网站| 日韩中文在线不卡| 久久国产加勒比精品无码| 色阁综合伊人av| 国产精品久久97| 精品国产一区二区三区久久| 国自产精品手机在线观看视频| 亚洲免费视频在线观看| 久久久久久久久久国产精品| 精品亚洲一区二区三区在线观看|