ホームページ  >  記事  >  バックエンド開発  >  php+mysqlを使った無限分類例の詳細解説、mysqlの例_PHPチュートリアル

php+mysqlを使った無限分類例の詳細解説、mysqlの例_PHPチュートリアル

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

無制限の分類例、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) Collat​​e 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

tru​​ehttp://www.bkjia.com/PHPjc/943415.html技術記事 php+mysql による無制限の分別の例の説明、mysql の例 ここでは、php+mysql による無制限の分別の方法について説明します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。