PHP は無限レベルの分類を再帰的に実装します
一部の複雑なシステムでは、システムの柔軟性を高めるために情報列の無限レベルの分類が必要です。では、PHP はどのようにして無限分類を実現するのでしょうか?この記事では、再帰的アルゴリズムと mysql データ テーブルを組み合わせて無限分類を実現します。
再帰とは、簡単に言うと、プログラム コードを繰り返し呼び出すことです。コードがカスタム関数に書き込まれると、パラメーターやその他の変数が保存され、特定の条件が満たされるまでその関数が関数内で繰り返し呼び出されます。飛び出して対応するデータを返す前に到達しました。
まず、製品分類情報を記録するデータテーブルクラスを準備します。テーブルには 3 つのフィールドがあります。id: カテゴリ番号、主キーは自動的に増加します。title: カテゴリ名、pid: それが属する上位カテゴリの ID。
クラステーブル構造:
<code> CREATE TABLE IF NOT EXISTS `class` ( `id` mediumint(6) NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL, `pid` mediumint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; </code>
データを挿入した後、図に示すように:
さまざまなニーズに応じて、2 つのカスタム関数を異なる形式で提供しています。1 つは文字列を返し、もう 1 つは配列を返します。どちらの関数も再帰メソッドを使用します。まず、文字列形式を返す関数を見てみましょう:
<code> function get_str($id = 0) { global $str; $sql = "select id,title from class where pid= $id"; $result = mysql_query($sql);//查询pid的子类的分类 if($result && mysql_affected_rows()){//如果有子类 $str .= '<ul>'; while ($row = mysql_fetch_array($result)) { //循环记录集 $str .= "<li>" . $row['id'] . "--" . $row['title'] . "</li>"; //构建字符串 get_str($row['id']); //调用get_str(),将记录集中的id参数传入函数中,继续查询下级 } $str .= '</ul>'; } return $str; } </code>
上記の関数 get_str() は、再帰によって下位レベルのカテゴリを継続的にクエリし、最後に文字列を返します。プロジェクトのニーズに応じて str を変更し、最終的に無限の階層リストを生成します。
<code> include_once('connect.php'); //连接数据库,connect.php文件自己写一个啊 echo get_str(0); //输出无限级分类 </code>
次に、配列形式を返す関数を見てみましょう。また、再帰を使用する必要があります。
<code> function get_array($id=0){ $sql = "select id,title from class where pid= $id"; $result = mysql_query($sql);//查询子类 $arr = array(); if($result && mysql_affected_rows()){//如果有子类 while($rows=mysql_fetch_assoc($result)){ //循环记录集 $rows['list'] = get_array($rows['id']); //调用函数,传入参数,继续查询下级 $arr[] = $rows; //组合数组 } return $arr; } } </code>
<code> include_once('connect.php'); //连接数据库 $list = get_array(0); //调用函数 print_r($list); //输出数组 </code>
json 形式でデータを出力したい場合は、次を使用できます:
<code> echo json_encode($list); </code>