これを見れば、各カテゴリをデータベースに挿入する方法は誰もが理解できると思うので、例は示しません。各カテゴリをデータベースに挿入する方法はすでにわかっています。では、各カテゴリをどのようにリストするか?
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 パラメータとして使用して、独自のサブクラスをリサイクルします。
}
}
}
?>
id、parentid、name の 3 つのフィールドのアルゴリズムも非常に単純で再帰的です。再帰ではすべてのサブクラスが取得されていたため、これまでは再帰を使用するのは非常に愚かでした。最近、データテーブルをクエリするというアイデアを思いつき、地球上の誰もが思いつくメソッドを考えました。以下はコードです。クラスです。コードは次のとおりです:
コードをコピーします。コードは次のとおりです:
クラスツリー {
/**
* すべての機密情報はデータベースからクエリされます
* @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/971936.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/971936.html技術記事 php+mysql实现無制限分类例详解この篇文章主介绍了php+mysql实现無制限分类的方法、实例分析了mysqlデータベース库计、データ库操作及無制限分类的具体的...