`f_id ` int(11) NOT NULL COMMENT '親 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'); //次に、データベース カテゴリに 'PHP6.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」の ID が、独自の f_id フィールドの値として使用されます。 INSERT INTO `class` (`id`, `f_id`, `name`) VALUES(5, 4, 'PHP technology'); //これを見れば、それぞれをデータベースに挿入する方法が理解できると思います。機密扱い。これ以上の例はありません。
各カテゴリをデータベースに挿入する方法はすでにわかっていますが、各カテゴリをリストするにはどうすればよいでしょうか?
コードは次のとおりです | コードをコピーします |
header("Content-type:text/html;charset=utf-8"); $db=new mysqli(" localhost"," root","","news_php100"); //データベース接続をインスタンス化します。これを使用する前に、mysqli クラス ライブラリがロードされていることを確認するか、mysql_connect を使用して接続してください。 if(mysqli_connect_errno()){ echo "リンクに失敗しました:".mysqli_connect_error(); exit(); } $db->query("set names 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()){ echo $row['name']." "; //これは 'news' のサブクラスをループアウトします。注: 孫カテゴリを除く、サブカテゴリのみ。 } //ここに書くと、この分類が 10 レベルの分類である場合、各サブカテゴリーを循環させるために 10 回のループを記述する必要があることがわかります。さらに多くのレベルの分類がある場合、このように記述するのは明らかに非現実的です。 //それでは、解決策は何でしょうか?再帰関数を作成し、パラメーターとして f_id を渡し、各 f_id の値を継続的にループします。つまり、各 f_id 値のサブクラスをループアウトします。 //まず、各カテゴリの値を 2 次元配列に保存します。これは、次の再帰関数で役立ちます。 $result=$db->query("select * from class"); 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 array * / 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 array */ 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 = count($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]; else $add .= ' '; }
if($is_top == $cnt){ $space = $this->icon[ 2]; $parent_end = true; spacer'=>$add.$k.$space, 'name'=>$child[ 'name'], 'id'=>$cid ); $is_top++;
$this- >deep++; if($this->getChild($cid)) $this-> getTree($cid,$add,$parent_end); $this->deep–;
}
} return $this->tree; }
/** * 下位レベルの分類配列を取得します * @param int $root */ 関数getChild($root = 0){
$a = $child = array(); foreach($this- >arr as $id=>$a){ if($a['parentid'] = = $root){ $child[$a['id']] = $a; } } return $child?$child:false; } /** * ソース配列を設定します * @param $arr */ function setArr ($arr = array()){ $this->arr = $arr; } }
クエリを通じて構造体を配列に保存し、その配列に対して再帰操作を実行します。プログラムの実行効率が大幅に向上します コードの使用は非常に簡単です
http://www.bkjia.com/PHPjc/444660.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/444660.html技術記事 1. データベースは親クラス ID を設定することで一意のインデックスを作成し、関数の再帰呼び出しを使用して無制限の分類を実現します。 2. データベース設計は特定の形式で配置され、mysql を使用してクエリを実行します。
|