1. Web サイトを構築する人は、一般に分類の処理の問題に遭遇するでしょう。無制限の分類を処理する例をいくつか載せておきます。
データベースの構造は非常に単純です:
id、fatcher_id。 、名前、.. ...
この設計は短く簡潔で、ほとんどの要件を満たします。このデータベース構造でのプログラムの実装を見てみましょう。 >
1. 再帰クエリ データベース
最も恐ろしいアプローチ ~ および最良の実装
カテゴリ 1
カテゴリ 1.1
カテゴリ 1.1.1
カテゴリ 1.2
カテゴリ 2
カテゴリ 2.1
カテゴリ 3
カテゴリ 3.1
カテゴリ 3.2
...
このようなディレクトリ構造を生成するために、プログラムは、分類が必要な場合はどこでもデータベースに 1 回再帰的にクエリを実行します (ページ、クエリ....)、データベースはハードディスクを悲劇的に操作します....アーメン~ソ~ジャンプ...
2. データベースを 1 回クエリすると、再帰配列が上記を生成します。ディレクトリ構造 一般的なアイデアを投稿します
function SelectList(&$Data, $RootID = 0')
{
for($i = 0; $i < count($Data) ); $i ) }
通常の Web サイトでは、この種の再帰で十分です。ただし、BT ポイントが存在する場合は、再帰がいくつか存在します。同時実行性を考慮すると...ははは、もう一度ジャンプしましょう
3. データベースを 1 回クエリして、ディレクトリ構造を非再帰的に生成します
このステップでは、プログラムのコツは、結果を一度トラバースするだけです。 上記のようなディレクトリ構造を生成できます。 以下は他の人が書いたもので、それを試してみました。
function GetArray($RootID = 0)
{
$Data = array();
$Data = $tblObj->MapResult($tblObj->;
$Output = Array(); $len = Count($Data);
if($RootID);
while($Data[$i]['UID'] != $RootID && $i < $len) $i ;
}
$UpID = $RootID; //前のノードが指す
for($cnt = Count($Data); $i {
$j = 0;この分類に基づくサブカテゴリのデータ
if($ upid == $ rootid) / /最初のループで、すべての第1レベルの分類を$ outputアレイ
)//前のノードを決定するかどうかを判断します兄弟ノードです
{
{
$Output[$j] = $Data[$i] // ノードを出力配列に保存します
$tmp[$Data [$i] ['ID']] = &$Output[$j]; //出力にノード ID の位置を保存します。
}
else
{
while($Data[$i]['UID'] == $UpID && $i < $len)
if($tmp[ $アップID ])
{
$tmp[$UpID]['Child'][$j] = $Data[$i];
$tmp[$Data[$i]['ID']] = &$tmp[$UpID]['Child'][$j]; //出力内の位置に保存される节点ID
}
$i ;
$j ;
}
}
$UpID = $Data[$i]['UID'];
}
return $Output;
}
プログラムはとても疲れそうです~ このコードの効率は前のコードよりも 10 倍以上速く、強度システムは十分強力です...
しかし...Web サイトの 90% が使用していますこんなコードはもったいないですね~ 私がこれまでに遭遇した Web サイトの分類は一般的にレベル 4 未満なので、さらに最適化できますか?... もう一度ジャンプしましょう...
4. データベースから始めましょう~
データベースの構造を少し変更し、レイヤーの冗長フィールドを追加しました。これは DB 設計の専門家によって考えられたものです。
1 合計カテゴリ 0 カテゴリ 1 1 010000
3 カテゴリ 1.1 2 010100
4 カテゴリ 1.2 2 0102 00
5 カテゴリ 2 1 020000
6 カテゴリ 2.1 5 020100
7 カテゴリ 3 1 030000
8 カテゴリ 3.1 7 030100
9 カテゴリ 3.2 7 030200
10 カテゴリ 1.1.1 3 010101
次に、レイヤーのサイズで検索します。見てください: SELECT * FROM Type_table_2 ORDER BY type_layer
レコードのリスト セット
id name Father_idlayer
1 Total カテゴリ 000000
2 カテゴリ 1 1 010000
3 カテゴリ 1.1 2 010100
10 カテゴリ 1.1.1 3 010101
4 カテゴリ 1.2 2 010200
5 カテゴリ 2 1 020000
6 カテゴリ 2.1 3.2 7 0 30200
わかりますか? ディレクトリ構造も 1 つのクエリで生成されます。これにより、プログラムが非常に簡単になります。このルーチンでは、レイヤー フィールドは各レベルで 99 個のカテゴリを処理できます。笑、最初にニーズを分析してください。 ~オーバー~シャンレン~