無限分類は古いトピックです。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,
子=>配列(
&配列(
'id'=>3,
'名前'=>'ノートブック',
'pid'=>1,
'children'=>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] => 1
[名前] => コンピューター
[pid] => 0
[子] => 配列
(
[0] => 配列
(
[id] => 3
[名前] => ノート
[pid] => 1
[子] => 配列
(
[0] => 配列
(
[id] => 7
[名前] => ウルトラブック
[pid] => 3
[子] => 配列
(
)
)
[1] => 配列
(
[id] => 8
[名前] => ゲームノート
[pid] => 3
[子] => 配列
(
)
)
)
)
[1] => 配列
(
[id] => 4
[名前] => デスクトップ
[pid] => 1
[子] => 配列
(
)
)
)
)
[2] => 配列
(
[id] => 2
[名前] => 携帯電話
[pid] => 0
[子] => 配列
(
[0] => 配列
(
[id] => 5
[名前] =>スマートフォン
[pid] => 2
[子] => 配列
(
)
)
[1] => 配列
(
[id] => 6
[名前] => 機能電話
[pid] => 2
[子] => 配列
(
)
)
)
)
[3] => 配列
(
[id] => 3
[名前] => ノート
[pid] => 1
[子] => 配列
(
[0] => 配列
(
[id] => 7
[名前] => ウルトラブック
[pid] => 3
[子] => 配列
(
)
)
[1] => 配列
(
[id] => 8
[名前] => ゲームノート
[pid] => 3
[子] => 配列
(
)
)
)
)
[4] => 配列
(
[id] => 4
[名前] => デスクトップ
[pid] => 1
[子] => 配列
(
)
)
[5] => 配列
(
[id] => 5
[名前] =>スマートフォン
[pid] => 2
[子] => 配列
(
)
)
[6] => 配列
(
[id] => 6
[名前] => 機能電話
[pid] => 2
[子] => 配列
(
)
)
[7] => 配列
(
[id] => 7
[名前] => ウルトラブック
[pid] => 3
[子] => 配列
(
)
)
[8] => 配列
(
[id] => 8
[名前] => ゲームノート
[pid] => 3
[子] => 配列
(
)
)
)
メリット:関係性が明確で、上司と部下の関係を修正しやすい。
欠点: PHP を使用して処理すると、カテゴリの数が膨大になると効率も低下します。
2番目の方法
このメソッドは、テーブルフィールドにパスフィールドを追加します:
テーブル:カテゴリ
id int 主キー、自動インクリメント
name varchar カテゴリ名
pid int 親クラス ID、デフォルトは 0
パス varchar パス
データ例:
ID名pidパス
1 台のコンピューター 0 0
2 モバイル 0 0
3 ノート 1 0-1
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/962922.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/962922.html技術記事 PHP + Mysql で無制限の分類を実現する方法のまとめ この記事では、PHP + Mysql で無制限の分類を実現するための 2 つの方法を主に紹介し、必要な場合は 2 つの方法の長所と短所を比較分析します。