ホームページ  >  記事  >  バックエンド開発  >  PHP 無制限分類プログラム コード_PHP チュートリアル

PHP 無制限分類プログラム コード_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:48:02710ブラウズ

無限分類 データを分類する場合、ほとんどの場合、ニュースやソフトウェア チャネルにはさまざまなサブカテゴリがある可能性がありますが、これらのサブカテゴリがわからないため、無限分類方法を使用する必要があります。

最初のカテゴリ (親カテゴリ) –> 2 番目のカテゴリ (子カテゴリ) –> 3 番目のカテゴリ (孫カテゴリ)

そのような親族分類が増えるほど、プログラムとデータベースを制御することがより複雑になり、同じレベルでの分類処理と制御は非常に簡単になります。これは、次のようなこのレベルの分類を記録するのに必要なデータベースが 1 つだけであるためです。 、ニュースやその他の分類はこのレベルでの処理が非常に簡単ですが、Web サイトの場合は、第 1 レベルの分類だけでは十分ではなく、次のように再度分類する必要があります。

システム –> Linux、Windows

ニュース – > Linux ニュース、Windows ニュース

この分類はより明確になります。少なくともシステムには Linux と Windows が含まれ、ニュースには Linux ニュースと Windows ニュースが含まれることを理解できるようになります。情報をより明確にするために、引き続き次のように分類します。

linux–>システム ツール、カーネル、プログラミング言語、開発ツール


分類が第 3 レベルになると、情報の処理がより明確になります。つまり、情報を明確に処理するには、分類が詳細であればあるほど、情報の処理が容易になります。ネチズンが明確な目的を持って必要な情報を見つけやすくなります。しかし、分類が改良され続けるにつれて、プログラムとデータベースを制御することはますます困難になります。

問題 1: データベース内のこれらの関連する血縁分類をどのように扱うか?

難易度 2: php を使用してこの明確な関係を完成させるにはどうすればよいですか?

この種のマルチレベルで詳細な分類は、すべての PHP プログラマーが解決しなければならない問題です。優れた Web サイトを作成するには分類の問題は避けられず、この問題の解決は非常に複雑であり、その中で最大の問題はデータベースの分類処理。データベースが適切に処理されないと、膨大な作業負荷が発生し、データベースの再計画も必要になるためです...

これは誇張ではありません。データベースを扱うときに、多くの人が第 1 レベルの分類を使用してデータベースを構築するためです。当時、ほとんどの Web サイトは第 3 レベルに分類されていたため、私もこの方法を採用しました。データベース 処理に必要な分類データベースは 3 つだけですが、下位の分類を続ける必要がある場合、このアプローチの欠点が明らかになります。分類が下位になるほど、ワークロードとプログラムの量が大幅に増加するためです。

今回紹介する方法は、分類データベースを使って無限下位分類法を作成する方法です。Windowsを使用したことのある読者ならご存知の通り、Windowsフォルダーには無限下位分類ディレクトリが作成でき、その下にディレクトリを作り続けることができます。 , このように延々と続きますが、Linuxのディレクトリ作成にもこの機能があります

私が紹介した方法はこの形式と同じです。

データベース計画

分類の複雑さについては先ほど説明しましたが、無制限の分類を実現するには、データベースをどのように計画するかが非常に重要なステップになります。

私はかつてフォーラムのデータベース計画について紹介しました。はい、フォーラムは無制限のフォローアップを実現できます。分類は子供と親の間の関係でもあります。このような子供と親の関係を明確にするためには、いくつかの困難があります。

1) 各カテゴリーの情報保管の扱い方;
2) 分類の親族関係にどう対処するか;

3) 情報に関するお問い合わせへの対応方法

親族関係のデータベース処理は、フォーラムのデータベース処理に似ています。ここでは、分類を処理するためのタイプ データベースを構築します。

フィールドの作成:
id(int): 各カテゴリの自然なシリアル番号を記録するために使用されます
uid(int): このカテゴリの親カテゴリの ID 番号を記録するために使用されます

type(char): カテゴリの名前

roue_id (varchar): 親族関係を示すための親族ツリー、:0:2:10:20: の ID で接続します

roue_char (varchar): アフィニティ ツリー、次のようなもの: system: linux: 開発ツール: gcc: (このフィールドが存在するかどうかは関係ありません。各アフィニティをよりわかりやすく理解するために、もちろん文字表現はより直接的です数値表現よりも^o^ですが、このフィールドを追加するのが最適です)


このような無制限のカテゴリテーブルが確立されました。次に、情報を保存するためのデータベースを確立する必要があります。テーブルを処理してクエリするのが最も便利です。そのため、情報を保存するためのテーブル type_message:

id(int): メッセージのシリアル番号;
typeid(int): カテゴリの ID 番号;
title(varchar): メッセージのタイトル;

メッセージ(テキスト): メッセージの内容;

time: 情報が作成された時刻;

これら 2 つのデータ テーブルは、無制限の分類タスクを完了できます (2 つのテーブルの補助フィールドは追加されません。読者は独自に追加できます)。
残りのタスクはphpによって処理されます

プログラム制御
このステップは、無限分類関数を実装する上で最も複雑で手間がかかるものです。まず、プログラム内で完了する必要があるステップを見てみましょう。

1) アップロード用のカテゴリを作成します;

2) アップロードする情報を作成します;

3) 各カテゴリとそれらの関係を明確に表示します。

4) プロセスクエリ関数;

5) 編集および削除機能の処理方法;


カテゴリの編集と削除には均一性の問題が含まれるため、これら 5 つのステップの中で最も難しいのは 5 番目のステップです。

以下、phpのプログラム制御を一つ一つ説明していきます

1)カテゴリーを作成してアップロード

この関数を紹介する前に、まず、explode() 関数を紹介します。これは、文字列を分解するために使用される、次のような具体的な使用法です。

「0:1:2:3:4」の数字を分解します

$val="0:1:2:3:4";
$rid=explode(":",$val);

Expand() 関数によって処理された後、$val 内のすべての数値が $rid 配列に分解されます。引用したい場合は、単に echo “$rid[0],$rid[1],$rid” と出力します。 [2]… "; 以上です。explode() 関数は、分類プロセス全体において非常に重要な役割を果たします。次に、非現行分類のプログラム制御の導入を始めましょう。

合計分類が 0 であり、すべての分類がその子孫であると仮定できます。次に、最初の分類「システム」を確立し、それがデータベースにどのように保存されるかを見てみましょう。

id | ルート ID | 1 | 0 | システム

次に、「Linux」を以下に分割しました:

id | ルート ID | 2 | 1 | システムLinux

上記はデータベース ストレージの形式です。これはフォーラム コードとよく似ています。必要なのは、カテゴリ ID を uid に入力し、親カテゴリの uid を 0 に入力することだけです。コード:


コードは次のとおりです

コードをコピー ……";
echo "";

エコー "";

エコー "

……

//デフォルトページを設定します

if (empty($func)) $func=="showtype";

//親カテゴリのuidを設定します

if (empty($uid)) $uid=0;


//データベースストレージ******************************************** *** ***

if ($func=="保存"):


$フィールド = "";

$values = "";


if ($id!="") {

$fields .= ",id";

$values.=",$id";
}

if ($uid!="") {
$fields .= ",uid";
$values.=",$uid";
}

if ($type!="") {
$fields .= ",type";
$values.=","$type"";
}

if ($route_id=="") {

//親カテゴリのroute_idを取得します
if ($uid!=0) {

$result = mysqlquery("select * from type where id=$uid");

$route_id=mysql_result($result,0,"route_id");

} その他 {

$routr_id="0";
}
$fields .= ",route_id";
//独自のroute_idを作成します
$route_id="$route_id:$id";
$values.=","$route_id"";
}

//独自のroute_charを作成します
if ($route_char!="") {
$fields .= ",route_char";
$route_char="$route_char:$type";

$values.=","$route_char"";

} その他 {
$fields .= ",route_char";
$route_char=$type;
$values.=","$route_char"";
}

$fields = substr($fields,1,strlen($fields)-1);
$values = substr($values,1,strlen($values)-1);

$result = mysqlquery("型 ($fields) 値 ($values) に挿入");

...

endif; /* 保存を終了 */

//カテゴリーアップロード******************************************** *** ***

if ($func=="createtype"):

//自分の ID を取得します

$result = mysqlquery("select * from type order by

ID の説明");
$num=mysql_numrows($result);

if (!empty($num)) {

$cat = mysql_result($result,0,"id");
} その他 {
$cat=0;
}

//分類のステータスを決定する
if ($uid != 0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");

$route_char=mysql_result($result,0,"route_char");

} その他 {
$type="親カテゴリ";
}
echo "

";

エコー "";
echo "
Category:$type
カテゴリの作成:
";

$cat=$cat+1;
echo "";
echo "";

echo "";

echo "

";
echo "";
エンドイフ; /* createtype の終了 */

//显示分类********************************************* ***
if ($func=="showtype"):

エコー "";

//分別状態判断
if ($uid!=0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");
} その他 {
$type="父分类";
}

echo "创建分类";

echo "$type";

$result=mysql_query("select * from type where uid=$uid");
$num=mysql_numrows($result);

if (!empty($num)) {
for ($i=0;$i

$id=mysql_result($result,$i,"id");
$type=mysql_result($result,$i,"type");

エコー "";
echo "$type";
echo "";
}
}

エコー "";
エンドイフ; /* ショータイプの終了 */
……
……

?>

以上の手順により、無制限の分別クラスの基本的な構築、保存、および表示が完了し、次に完全な分別クラスの構築機能の各部分が完了します。

経路跟追跡

前に分別の構築方法を説明しましたが、分別テーブルに rout_id と rout_char という 2 つの分別経路を保存する情報が記載されており、何も処理しない場合、プログラムは次の順序で最下層まで進むことができます。倒立退行 (もちろん、ブラウザのバック ボタンを利用することもできますが、このプロセスは不完全です)、したがって、 rout_id と rout_char の情報分解を完了する必要がある経路指示です。
具体的な実行法、假如データ库记これ么一条分类信息:

ID:4

uid:2

タイプ:开公開工具
ルートID:0:1:2:4
rout_char:系统:linux:开公開工具

当プログラムが分別クラス「公開ツール」に到達したとき、経路情報の表示を要求するほかに、パス上の任意の分クラスに移動できるようにする必要がありますか?ここでは、explode() 関数の使用が必要です。と rout_char は相互関係があるため、分解できます:

代码如下
复制幣

$path=explode(":",$rout_id);

$path_gb=explode(":",$rout_char);


今回はすべての分別情報が分解されており、現在行われているのは接続された方法で経路情報です:

代码如下


上記のコードは、パスを復元するためのリンクを追加する機能を実装しています。無限分類を実装しているため、上限はなく、for($i=0;;$i++) に範囲制限はなく、ループ出口が設定されています。条件は、$path_gb[$i] の値が空であることです。次のコードをカテゴリ表示レイアウトのプログラム ブロックに挿入するだけです。

复制幣

for ($i=0;;$i++) {

$a=$i+1;

エコー「」 href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],":";
if (empty($path_gb[$i])) {
休憩;
}
}

コードは次のとおりですコードをコピー";
//********終わり***********************

} 他 {

$type='父分类';
}

echo "";

echo "";

$result=mysql_query("select * from type where uid=$uid");

$num=mysql_numrows($result);

if (!empty($num)) {

for ($i=0;$i

$id=mysql_result($result,$i,"id");

$type=mysql_result($result,$i,"type");

エコー "";
}
}

エコー "

……
……
//カテゴリを表示********************************************* **
if ($func=='showtype'):

エコー "";

//分類のステータスを決定する

if ($uid!=0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");

//******** 新規追加代 ***************

$rout_id=mysql_result($result,0,"rout_id");
$rout_char=mysql_result($result,0,"rout_char");
$path=explode(":",$rout_id);
$path_gb=explode(":",$rout_char);
echo "

";
for ($i=0;;$i++) {
$a=$i+1;
エコー「」 href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],":";
if (empty($path_gb[$i])) {
休憩;
}
}
echo "
创建分类
$type
";

echo "$type";
echo "

";

エンドイフ; /* ショータイプの終了*/
……
……
?>

この機能ブロックを完了した後、引き続き機密情報を表示できます

http://www.bkjia.com/PHPjc/632808.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632808.html技術記事無限分類 ほとんどの場合、データを分類するとき、ニュースやソフトウェア チャネルにはさまざまなサブカテゴリがある可能性がありますが、これらのサブカテゴリがわからないため、以下の無限分類方法を使用する必要があります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。