ホームページ >バックエンド開発 >PHPチュートリアル >PHP+Mysql で無制限の分類を実現する方法のまとめ、phpmysql_PHP チュートリアル
無限の分類は古いトピックですが、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] =>
[子] => 配列
(
)
)
)
メリット:関係性が明確で、上司と部下の関係を修正しやすい。
2番目の方法
このメソッドは、テーブルフィールドにパスフィールドを追加します:
テーブル:カテゴリid int 主キー、自動インクリメント
name varchar カテゴリ名
pid int 親クラス ID、デフォルトは 0
パス varchar パス
データ例:
ID名名PIDパス
1 台のコンピューター 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 |
この方法は多くの人にも採用されており、以下のようにまとめました。
利点: クエリが簡単、効率が高く、パスフィールドにインデックスを付けることができます。
欠点: ノードの関係を更新するのは面倒で、すべての子孫のパス フィールドを更新する必要があります。
上記がこの記事の全内容です。2 つの方法のうち、どちらが好みですか?皆さんも気に入っていただければ幸いです。
http://www.bkjia.com/PHPjc/963127.html