無制限の分類例、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 に設定します。
コードをコピー コードは次のとおりです:
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のサンプルコードは次のとおりです:
コードをコピーします
コードは次のとおりです:
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 のアルゴリズムも非常に単純で再帰的です。再帰ではすべてのサブクラスがデータ テーブルのクエリによって取得されていたため、これまでは再帰を使用するのは非常に愚かでした。最近、地球上の誰もが考えることができるメソッドを思いつきました。以下はコードです。クラスです。コードは次のとおりです:
コードをコピーします
コードは次のとおりです:
クラスツリー {
/**
* すべての機密情報はデータベースからクエリされます
* @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
www.bkjia.comtruehttp://www.bkjia.com/PHPjc/943415.html技術記事 php+mysql による無制限の分別の例の説明、mysql の例 ここでは、php+mysql による無制限の分別の方法について説明します。