php+mysqlを使った無限分類例の詳細解説、mysqlの例_PHPチュートリアル
mysql
php
分類
無制限
無制限の分類例、mysql 例の php+mysql 実装
この記事の例では、php+mysqlを使って無制限の分類を実現する方法を説明しています。参考のためにみんなで共有してください。具体的な分析は次のとおりです:
1. データベースは親クラス ID を設定することで一意のインデックスを作成し、関数の再帰呼び出しを使用して無制限の分類を実現します。
2. データベース設計は特定の形式で配置され、mysql を使用してキー関数 concat をクエリします。プログラムの実装は比較的単純です。まず、News → PHP News という 3 つのレベルの分類があると仮定します。 → PHP6.0が出ました「PHP6.0 がリリースされました」というニュースを見つけたい場合は、まずニュースをクリックし、次に PHP ニュースをクリックすると、それを見つけることができます。つまり、下位レベルで検索できます。一方、サブクラスの親クラスがわかっていれば、データベースを設計するときに、親クラス ID を取得するための追加フィールドを設計できます。無制限の分類
データベースのコードは次のとおりです:
ここでテーブル「クラス」を作成します
コードをコピーします コードは次のとおりです:
CREATE TABLE `class` (
`id` int(11) NOT NULL auto_increment COMMENT 'カテゴリ ID'、
`f_id` int(11) NOT NULL コメント '親 ID'、
`name` varchar(25) Collate gbk_bin NOT NULL COMMENT 'カテゴリ名',
主キー (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;
まず、「News」カテゴリをデータベースに挿入します。「News」が最大のカテゴリであり、親カテゴリがないため、その f_id を 0 に設定します。`f_id` int(11) NOT NULL コメント '親 ID'、
`name` varchar(25) Collate gbk_bin NOT NULL COMMENT 'カテゴリ名',
主キー (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;
コードをコピー コードは次のとおりです:
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(1, 0, 'News');//id フィールドは自動的に増加するため、値を書き込む必要はありません。
次に、カテゴリ「PHP News」をデータベースに挿入します。その親カテゴリ「News」の ID は 1 なので、その f_id は 1 に設定されます。
コードをコピー コードは次のとおりです:
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(2, 1, 'PHP News');
次に、カテゴリ「PHP 6.0 is out」をデータベースに挿入します。その親カテゴリ「PHP News」の ID は 2 なので、その f_id は 2 に設定されます。
コードをコピーします コードは次のとおりです:
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(3, 2, 'PHP6.0 is out');
同様に、カテゴリを下まで挿入することができるため、無限のカテゴリに到達します。カテゴリを挿入する鍵は、このカテゴリの親カテゴリの ID を見つけて、それをこのカテゴリの f_id フィールドの値として使用することであることがわかります。
カテゴリ「Technology」を「News」と同じレベルに挿入するとします。つまり、これが最大のカテゴリでもあり、その上に親カテゴリが存在しない場合、その f_id も 0 に設定されます。
コードをコピーします コードは次のとおりです:
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(4, 0, 'Technology');
「Technology」の下に別のカテゴリ「PHP Technology」があるので、それを挿入するにはどうすればよいでしょうか? まず、「PHP Technology」の親クラス「Technology」の ID を見つけて、それを独自の f_id フィールドの値として使用します。 .
コードをコピーします コードは次のとおりです:
INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP Technology');
これを見れば、各カテゴリをデータベースに挿入する方法は誰もが理解できると思うので、例は示しません。各カテゴリをデータベースに挿入する方法はすでにわかっています。では、各カテゴリをどのようにリストするか?
phpのサンプルコードは次のとおりです:
コードをコピーします
コードは次のとおりです:
コードは次のとおりです:
一度の询制構造により次の数組を保存し、再数組で归运計算を実行し、疑いもなく大幅に向上したプログラム実行効率を使用し、代価很简单を使用します。 ここで説明されている大家向けの php プログラムの設計が役立つことを望みます。
header("コンテンツタイプ:text/html;charset=utf-8");
$db=new mysqli("localhost","root","","news_php100"); //データベース接続をインスタンス化します。これを使用する前に、mysqli クラス ライブラリがロードされていることを確認するか、mysql_connect を使用して接続してください。
if(mysqli_connect_errno()){
echo "リンクに失敗しました:".mysqli_connect_error(); 終了(); }
$db->query("セット名 utf8"); $result=$db->query("select name from class where f_id=0"); // f_id=0 のカテゴリを検索します。つまり、各大カテゴリを検索します。
while($row=$result->fetch_assoc()){
echo $row['name']."
"; //これにより、各主要カテゴリがループアウトされます。
}
//同様に、ニュースのサブカテゴリをループアウトできます。
$result=$db->query("select * from class where f_id=1"); // f_id=1 のカテゴリを検索します。つまり、「ニュース」のサブカテゴリを検索します。
while($row=$result->fetch_assoc()){
エコー $row['name']。"
"; // これにより、「ニュース」のサブカテゴリーが循環します。 注: これはサブカテゴリーのみであり、孫カテゴリーは含まれません。
}
//ここに書くと、この分類が 10 レベルの分類である場合、各サブカテゴリーを循環させるために 10 回のループを記述する必要があることがわかります。さらに多くのレベルの分類がある場合、このように記述するのは明らかに非現実的です。
//それでは、解決策は何でしょうか?再帰関数を作成し、f_id をパラメーターとして渡し、各 f_id の値を継続的にループします。つまり、各 f_id 値のサブクラスをループアウトします。
//まず、各カテゴリの値を 2 次元配列に保存します。これは、次の再帰関数で役立ちます。
$result=$db->query("クラスから * を選択"); while($row=$result->fetch_assoc()){
$arr[]=array($row[id],$row[f_id],$row[name]); //各行には、カテゴリの ID、f_id、および名前の情報が保存されます。
}
function fenlei($f_id=0){ //$f_id は 0 に初期化されます。つまり、サイクルは最大分類から始まります。 Global $arr; //関数内で参照できるようにする前に、$arr をグローバル変数として宣言します。
for($i=0;$i
If($arr[$i][1]==$f_id){ //$arr[$i][1] は $i+1 番目のカテゴリの f_id の値を表します。 $f_id=0 から開始します。つまり、f_id=0 の分類を出力します。
echo $arr[$i][2]."
"; //$arr[$i][1] は $i+1 番目のカテゴリの名前の値を表します。
fenlei($arr[$i][0]); //$arr[$i][1] は、$i+1 番目のカテゴリの ID の値を表します。再帰を実行します。つまり、独自の ID を f_id パラメータとして使用して、独自のサブクラスをリサイクルします。
}
}
}
?>
3 つのフィールド id、parentid、name のアルゴリズムも非常に単純で再帰的です。再帰ではすべてのサブクラスがデータ テーブルのクエリによって取得されていたため、これまでは再帰を使用するのは非常に愚かでした。最近、地球上の誰もが考えることができるメソッドを思いつきました。以下はコードです。クラスです。コードは次のとおりです:
コードをコピーしますif(mysqli_connect_errno()){
echo "リンクに失敗しました:".mysqli_connect_error(); 終了(); }
$db->query("セット名 utf8"); $result=$db->query("select name from class where f_id=0"); // f_id=0 のカテゴリを検索します。つまり、各大カテゴリを検索します。
while($row=$result->fetch_assoc()){
echo $row['name']."
"; //これにより、各主要カテゴリがループアウトされます。
}
//同様に、ニュースのサブカテゴリをループアウトできます。
$result=$db->query("select * from class where f_id=1"); // f_id=1 のカテゴリを検索します。つまり、「ニュース」のサブカテゴリを検索します。
while($row=$result->fetch_assoc()){
エコー $row['name']。"
"; // これにより、「ニュース」のサブカテゴリーが循環します。 注: これはサブカテゴリーのみであり、孫カテゴリーは含まれません。
}
//ここに書くと、この分類が 10 レベルの分類である場合、各サブカテゴリーを循環させるために 10 回のループを記述する必要があることがわかります。さらに多くのレベルの分類がある場合、このように記述するのは明らかに非現実的です。
//それでは、解決策は何でしょうか?再帰関数を作成し、f_id をパラメーターとして渡し、各 f_id の値を継続的にループします。つまり、各 f_id 値のサブクラスをループアウトします。
//まず、各カテゴリの値を 2 次元配列に保存します。これは、次の再帰関数で役立ちます。
$result=$db->query("クラスから * を選択"); while($row=$result->fetch_assoc()){
$arr[]=array($row[id],$row[f_id],$row[name]); //各行には、カテゴリの ID、f_id、および名前の情報が保存されます。
}
function fenlei($f_id=0){ //$f_id は 0 に初期化されます。つまり、サイクルは最大分類から始まります。 Global $arr; //関数内で参照できるようにする前に、$arr をグローバル変数として宣言します。
for($i=0;$i
echo $arr[$i][2]."
"; //$arr[$i][1] は $i+1 番目のカテゴリの名前の値を表します。
fenlei($arr[$i][0]); //$arr[$i][1] は、$i+1 番目のカテゴリの ID の値を表します。再帰を実行します。つまり、独自の ID を f_id パラメータとして使用して、独自のサブクラスをリサイクルします。
}
}
}
?>
3 つのフィールド id、parentid、name のアルゴリズムも非常に単純で再帰的です。再帰ではすべてのサブクラスがデータ テーブルのクエリによって取得されていたため、これまでは再帰を使用するのは非常に愚かでした。最近、地球上の誰もが考えることができるメソッドを思いつきました。以下はコードです。クラスです。コードは次のとおりです:
コードは次のとおりです:
クラスツリー {
/**
* すべての機密情報はデータベースからクエリされます
* @var 配列
*/
var $arr;
/**
※フォーマットは以下の通りです
* var $arr = array(
1 => array('id'=>1','parentid'=>0,'name'=>'第 1 レベルの列 1')、
2 => array('id'=>2','parentid'=>0,'name'=>'第 1 レベルの列 2')、
3 => 配列('id'=>'3','parentid'=>1,'name'=>'第 2 レベルの列 1')、
);*/
/**
*出力構造
* @var 配列
*/
var $tree = array();
/**
* ツリー再帰の深さ
* @var int
*/
var $deep = 1;
/**
* ツリー状の変更シンボルを生成します
* @var 配列
*/
var $icon = array('│','§','└');
/**
* 指定された ID を持つ下位ツリー構造を生成します
* @param int $rootid ツリー構造のIDを取得するには
* @param string $add 再帰で使用されるプレフィックス
* @param bool $parent_end は、親カテゴリーが最後のカテゴリーかどうかを識別します
*/
function getTree($rootid = 0,$add = ”,$parent_end =true){
$is_top = 1;
$child_arr = $this->getChild($rootid);
if(is_array($child_arr)){
$cnt = カウント($child_arr);
foreach($child_arr as $key => $child){
$cid = $child['id'];
$child_child = $this->getChild($cid);
if($this->deep>1){
if($is_top == 1 && $this->deep > 1){
$space = $this->icon[1];
if(!$parent_end)
$add .= $this->icon[0];
それ以外の場合は $add .= ' ';
}
if($is_top == $cnt){
$space = $this->icon[2];
$parent_end = true;
}その他{
$space = $this->icon[1];
$parent_end = false;
}
}
$this->tree[] = array('spacer'=>$add.$k.$space,
'名前'=>$child['名前']、
'id'=>$cid
);
$is_top++;
$this->ディープ++;
if($this->getChild($cid))
$this->getTree($cid,$add,$parent_end);
$this->deep–;
}
}
$this->tree を返す;
}
/**
* 下位レベルの分類配列を取得します
* @param int $root
*/
関数 getChild($root = 0){
$a = $child = 配列();
foreach($this->arr as $id=>$a){
if($a['parentid'] == $root){
$child[$a['id']] = $a;
}
}
$child?$child:false を返します。
}
/**
* ソース配列を設定します
* @param $arr
*/
関数 setArr($arr = array()){
$this->arr = $arr;
}
}
?>
/**
* すべての機密情報はデータベースからクエリされます
* @var 配列
*/
var $arr;
/**
※フォーマットは以下の通りです
* var $arr = array(
1 => array('id'=>1','parentid'=>0,'name'=>'第 1 レベルの列 1')、
2 => array('id'=>2','parentid'=>0,'name'=>'第 1 レベルの列 2')、
3 => 配列('id'=>'3','parentid'=>1,'name'=>'第 2 レベルの列 1')、
);*/
/**
*出力構造
* @var 配列
*/
var $tree = array();
/**
* ツリー再帰の深さ
* @var int
*/
var $deep = 1;
/**
* ツリー状の変更シンボルを生成します
* @var 配列
*/
var $icon = array('│','§','└');
/**
* 指定された ID を持つ下位ツリー構造を生成します
* @param int $rootid ツリー構造のIDを取得するには
* @param string $add 再帰で使用されるプレフィックス
* @param bool $parent_end は、親カテゴリーが最後のカテゴリーかどうかを識別します
*/
function getTree($rootid = 0,$add = ”,$parent_end =true){
$is_top = 1;
$child_arr = $this->getChild($rootid);
if(is_array($child_arr)){
$cnt = カウント($child_arr);
foreach($child_arr as $key => $child){
$cid = $child['id'];
$child_child = $this->getChild($cid);
if($this->deep>1){
if($is_top == 1 && $this->deep > 1){
$space = $this->icon[1];
if(!$parent_end)
$add .= $this->icon[0];
それ以外の場合は $add .= ' ';
}
if($is_top == $cnt){
$space = $this->icon[2];
$parent_end = true;
}その他{
$space = $this->icon[1];
$parent_end = false;
}
}
$this->tree[] = array('spacer'=>$add.$k.$space,
'名前'=>$child['名前']、
'id'=>$cid
);
$is_top++;
$this->ディープ++;
if($this->getChild($cid))
$this->getTree($cid,$add,$parent_end);
$this->deep–;
}
}
$this->tree を返す;
}
/**
* 下位レベルの分類配列を取得します
* @param int $root
*/
関数 getChild($root = 0){
$a = $child = 配列();
foreach($this->arr as $id=>$a){
if($a['parentid'] == $root){
$child[$a['id']] = $a;
}
}
$child?$child:false を返します。
}
/**
* ソース配列を設定します
* @param $arr
*/
関数 setArr($arr = array()){
$this->arr = $arr;
}
}
?>
一度の询制構造により次の数組を保存し、再数組で归运計算を実行し、疑いもなく大幅に向上したプログラム実行効率を使用し、代価很简单を使用します。 ここで説明されている大家向けの php プログラムの設計が役立つことを望みます。
http://www.bkjia.com/PHPjc/943415.html
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
2週間前
By 尊渡假赌尊渡假赌尊渡假赌
レポ:チームメイトを復活させる方法
4週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
R.E.P.O.ファイルの保存場所:それはどこにあり、それを保護する方法は?
3週間前
By DDD

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック
Gmailメールのログイン入り口はどこですか?
7315
9


Java チュートリアル
1625
14


CakePHP チュートリアル
1348
46


Laravel チュートリアル
1260
25


PHP チュートリアル
1207
29



Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法
