PHP での無限分類の実装に関するアイデアをいくつか投稿してください~

WBOY
リリース: 2016-06-13 12:34:33
オリジナル
1018 人が閲覧しました

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 個のカテゴリを処理できます。笑、最初にニーズを分析してください。 ~オーバー~シャンレン~

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート