PHP+Mysql で無制限の分類を実現する方法のまとめ、phpmysql_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:05:34
オリジナル
868 人が閲覧しました

PHP+Mysql で無制限の分類を実現する方法のまとめ、phpmysql

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

最初の方法

この方法は非常に一般的で伝統的なものです。まずテーブル構造を見てみましょう。

テーブル:カテゴリ

id int 主キー、自動インクリメント
name varchar カテゴリ名
pid int 親クラス ID、デフォルトは 0
最上位カテゴリの pid はデフォルトで 0 です。特定のカテゴリのサブカテゴリ ツリーを取得する場合、基本的な考え方は再帰です。もちろん、効率の問題のため、再帰ごとにデータベースにクエリを実行することはお勧めできません。通常のアプローチは、最初にすべてを取得することです。カテゴリを抽出して PHP 配列に保存し、それを処理して、最後に結果をキャッシュして次のリクエストの効率を向上させます。

まず、データベースから直接取得できる元の配列を構築します。

コードをコピーします コードは次のとおりです: $categories = 配列(
Array('id'=>1,'name'=>'コンピュータ','pid'=>0),
array('id'=>2,'name'=>'携帯電話','pid'=>0),
array('id'=>3,'name'=>'Notebook','pid'=>1),
array('id'=>4,'name'=>'デスクトップ','pid'=>1),
Array('id'=>5,'name'=>'スマートフォン','pid'=>2),
array('id'=>6,'name'=>'関数マシン','pid'=>2),
array('id'=>7,'name'=>'Ultrabook','pid'=>3),
Array('id'=>8,'name'=>'ゲームノート','pid'=>3),
);

目標は、次の構造に変換することです

コンピューター

ノート
ウルトラブック
ゲームノート
デスクトップ
モバイル
スマホ
機能電話
配列で表される場合は、子キーを追加してそのサブカテゴリを保存できます:

コードをコピーします コードは次のとおりです: 配列(
//1はidに対応しており、直接読み込むのに便利です
1 => 配列(
'id'=>1,
'名前'=>'コンピューター',
'pid'=>0,
子=>配列(
&array(
'id'=>3,
'名前'=>'ノートブック',
'pid'=>1,
'children'=>array(
//ここで省略します )
)、
&array(
'id'=>4,
'名前'=>'デスクトップ',
'pid'=>1,
'children'=>array(
外出 )
)、
)
)、
//その他のカテゴリーは省略
)


処理プロセス:

コードをコピーします コードは次のとおりです:
$tree = array();
//最初のステップは、カテゴリ ID を配列キーとして使用し、子ユニットを作成することです
foreach($categories として $category){
$tree[$category['id']] = $category;
$tree[$category['id']]['children'] = array();
}
// 2 番目の部分では、参照を使用して各カテゴリを親クラスの子配列に追加し、1 回の走査でツリー構造を形成できるようにします。
foreach ($tree as $k=>$item) {
If ($item['pid'] != 0) {
$tree[$item['pid']]['children'][] = &$tree[$k];
}
}
print_r($tree);

印刷結果は以下の通りです:

コードをコピーします コードは次のとおりです:
配列
(
[1] => 配列
(
[ID] = & gt; [名前] = & gt; [pid] => 0
[子] => 配列
(
以来 (
                                                                                                                                                                            以来 [pid] => 1
[子] => 配列
                                                                                                                                                                                                                                 (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     )
)
                                                                                                                                                  (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           )
)
)
)
                                                                                                                                                                                                                                                                             (
                                                                                                                                                               [名前] => デスクトップ
[pid] => 1
[子] => 配列
                                                                              )
)
)
)
[2] => 配列
(
[id] => [名前] = & gt; [pid] => 0
[子] = & GT; (
以来 (
                                                                                                                                                                     [名前] =>スマートフォン
[pid] => 2
[子] => 配列
                                                                              )
)
以来 (
                                                                                                                                                                          [名前] => 機能電話
[pid] => 2
[子] => 配列
                                                                              )
)
)
)
[3] => 配列
(
[id] =>3
[名前] = & gt; [pid] =>1
[子] => 配列
(
以来 (
                                                                                                                                                                            [名前] => ウルトラブック
[pid] => 3
[子] => 配列
                                                                             )
)
以来 (
                                                                                                                                                      [名前] => ゲームノート
[pid] => 3
[子] => 配列
                                                                              )
)
)
)
[4] => 配列
(
[ID] = & gt; [名前] => デスクトップ
[pid] =>1
[子] => 配列
(
)
)
[5] => 配列
(
[ID] = & gt; [名前] => スマホ
[pid] => [子] => 配列
(
)
)
[6] => 配列
(
[ID] = & gt; [名前] = & gt; 機能電話
[pid] => [子] => 配列
(
)
)
[7] => 配列
(
[id] => [名前] = & gt; [pid] => 3
[子] => 配列
(
)
)
[8] => 配列
(
[ID] = & gt; [名前] = & gt; ゲームブック [pid] => [子] => 配列
(
)
)
)


メリット:関係性が明確で、上司と部下の関係を修正しやすい。

欠点: PHP を使用して処理すると、カテゴリの数が膨大になると効率も低下します。

2番目の方法

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

テーブル:カテゴリ

id int 主キー、自動インクリメント

name varchar カテゴリ名

pid int 親クラス ID、デフォルトは 0
パス varchar パス
データ例:

ID名名PIDパス
1 台のコンピューター 0 0

2 携帯電話 0 0

3 11 4 ウルトラブック 3 0-1-3
5 ゲームノート 3 0-1-3
path フィールドには、ルート カテゴリから上位レベルの親カテゴリまでのパスが記録され、id+'-' で表されます。

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

パスが次のようなカテゴリから id、名前、パスを選択します (id=1 のカテゴリからのパスとして concat(path,'-',id,'%') を選択します);

結果:

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

| ID パス | +-----+----------+----------+
| 0-1 |

| 4 | ウルトラブック | | 5 | ゲームブック | +-----+----------+----------+

この方法は多くの人にも採用されており、以下のようにまとめました。
利点: クエリが簡単、効率が高く、パスフィールドにインデックスを付けることができます。

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

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

http://www.bkjia.com/PHPjc/963127.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/963127.html

PHP+Mysql で無制限の分類を実現する方法のまとめ phpmysql での無制限の分類は古いトピックですが、PHP と Mysql を組み合わせてそれを実現する方法を見てみましょう。 最初の方法 この方法は非常に一般的で伝統的です...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!