ホームページ  >  記事  >  バックエンド開発  >  PHP+Mysqlで無制限の分類を実現する方法

PHP+Mysqlで無制限の分類を実現する方法

coldplay.xixi
coldplay.xixi転載
2020-08-15 16:58:453378ブラウズ

PHP+Mysqlで無制限の分類を実現する方法

無限分類は古いトピックですが、Mysql と組み合わせて PHP を実装する方法を見てみましょう。

[関連する学習の推奨事項: php プログラミング (ビデオ)、mysql ビデオ チュートリアル]

最初の方法

このメソッドは非常に一般的で伝統的なものです。最初にテーブル構造を見てみましょう。

テーブル: category
id ​​int 主キー、autoincrement
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),
);

目標は、それを次のように変換することです。次の構造

コンピュータ
ノートブック
ウルトラブック
ゲームブック
デスクトップ
携帯電話
スマートフォン
機能電話
配列で表すと、子キーを追加してそのサブカテゴリを保存できます:

コードは次のとおりです:

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 処理を使用すると、カテゴリの数が膨大になると、効率も低下します。

2 番目のメソッド

このメソッドは、パス フィールドをテーブル フィールドに追加するものです:

Table:category
id ​​int 主キー,increment
name varchar 分類名
pid int 親クラス ID、デフォルト 0
path varchar path
サンプル データ:

id ​​name pid path
1computer 0 0
2 携帯電話 0 0
3 ノートブック 1 0-1
4 Ultrabook 3 0-1-3
5 ゲームノートブック 3 0-1-3
path フィールドはルートからの分類を記録します上位レベルの親クラスへのパスは、ID '-' で表されます。

このように、コンピューター内のすべての子孫カテゴリをクエリしたいと仮定すると、必要な SQL ステートメントは 1 つだけです:

select id,name,path from category where path like (select concat( path, '-',id,'%') ID=1) のカテゴリからのパスとして;
Result:

---- ----------- -- -- ---
| id | 名前 | パス |
---- ----------- -------
| 3 | ノートブック| 0- 1 |
| 4 | ウルトラブック| 0-1-3 |
| 5 | ゲーム用ノートブック| 0-1-3 |
---- ----------- - - -----
この方法は多くの人にも採用されており、次のようにまとめました:

利点: クエリが簡単、効率が高く、パス フィールドにインデックスを付けることができます。

欠点: ノード関係の更新は面倒であり、すべての子孫のパス フィールドを更新する必要があります。

上記がこの記事の全内容です。方法が 2 つありますが、どちらをお好みですか?皆さんも気に入っていただければ幸いです。

関連する推奨事項: プログラミング ビデオ コース

以上がPHP+Mysqlで無制限の分類を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。