ホームページ  >  記事  >  バックエンド開発  >  PHP 無限分類の具体的な原理の分析_PHP チュートリアル

PHP 無限分類の具体的な原理の分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:30:29684ブラウズ

初心者にとって、PHP には詳しく調べる必要があることがまだたくさんあります。絶えず問題を解決することによってのみ、私たちは誠実さを理解することができます。 PHP 無制限分類とは何ですか? Windows で新しいフォルダーを作成するのと同じように、新しく作成したフォルダーの下に新しいフォルダーを作成することができます。これは、無限の分類にも当てはまります。そのサブクラスのクラスが作成され、これが無限ループで続きます。

それでは、PHP はどのようにして無限の分類を実現するのでしょうか?さまざまなカテゴリを 1 つずつリストするにはどうすればよいでしょうか?
まずニュース→PHPニュース→PHP6.0が出たというような3段階の分類があると仮定します。
「PHP6.0 がリリースされました」というニュースを見つけたい場合は、まずニュースをクリックし、次に PHP ニュースをクリックしてそれを見つけることができます。つまり、祖父を介してレベルごとに検索できます。クラスとその逆 さて、サブクラスの親クラスがわかっていれば、それを見つけることができます。このようにして、データベースを設計するときに、親クラス ID の追加フィールドを設計して、PHP の無制限の分類機能を実現できます。

//テーブル "class" を作成します
CREATE TABLE `class` (
`id` int(11) NOT NULL auto_increment COMMENT 'category id',
`f_id` int(11) NOT NULL COMMENT 'parent id' ,
`name` varchar(25) Collat​​e gbk_bin NOT NULL COMMENT 'カテゴリ名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB 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');

//同様に、カテゴリをずっと下まで挿入できます。 PHP の無制限の分類も実現します。
//カテゴリを挿入するための鍵は、このカテゴリの親カテゴリの 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');

//これを見れば、誰もがそれぞれをデータベースに挿入する方法を理解できるはずです。これ以上の例はありません。

各カテゴリをデータベースに挿入する方法はすでにわかっていますが、各カテゴリをリストするにはどうすればよいでしょうか?

<ol class="dp-xml">
<li class="alt"><span><span class="tag">< ?</span><span class="tag-name">php</span><span> </span></span></li><li><span>header("Content-type:text/html;</span><span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8");   </span></li><li class="alt"><span>$</span><span class="attribute">db</span><span>=</span><span class="attribute-value">new</span><span> mysqli("localhost","root","","news_php100") ; <br />//实例化一个数据库连接。使用这个前一定要确保已经加载了mysqli类库,<br />或者用mysql_connect这个方式连接。   </span></li><li><span>if(mysqli_connect_errno()){  </span></li><li class="alt"><span>echo "链接失败:".mysqli_connect_error();  </span></li><li><span>exit(); }   </span></li><li class="alt"><span>$db-</span><span class="tag">></span><span>query("set names utf8");  </span></span></li>
<li>
<span>$</span><span class="attribute">result</span><span>=$db-</span><span class="tag">></span><span>query("select name from class where </span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">0</span><span>"); <br>//查找</span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">0</span><span>的分类,也就是查找每一个大类。  </span>
</li>
<li class="alt">
<span>while($</span><span class="attribute">row</span><span>=$result-</span><span class="tag">></span><span>fetch_assoc()){  </span>
</li>
<li>
<span>echo $row['name']."</span><span class="tag">< </span><span class="tag-name">br</span><span class="tag">></span><span>"; //这样就把每个大类循环出来了。  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span>//同样我们可以把新闻的子类循环出来。  </span></li>
<li class="alt">
<span>$</span><span class="attribute">result</span><span>=$db-</span><span class="tag">></span><span>query("select * from class where </span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">1</span><span>"); <br>//查找</span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">1</span><span>的分类,也就是查找‘新闻’的子类。  </span>
</li>
<li>
<span>while($</span><span class="attribute">row</span><span>=$result-</span><span class="tag">></span><span>fetch_assoc()){  </span>
</li>
<li class="alt"><span>echo $row['name']."  </span></li>
<li><span>"; //这样就把‘新闻’的子类循环出来了。注意:只是子类,不包括孙子类。  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>//写到这里,我们会发现一个问题,如果这个分类是10级分类,难道我们要写<br>10个循环把它每个子类循环出来?如果是更多级分类呢,这样写显然是不现实的。  </span></li>
<li class="alt"><span>//那又有什么办法解决呢?我们可以写一个递归的函数,把f_id作为参数传入,<br><br>不断循环每一个f_id的值,也就是说把每一个f_id值的子类循环出来。  </span></li>
<li><span>//首先我们把各个分类的值保存在一个二维数组中,在下面的递归函数里有用。  </span></li>
<li class="alt">
<span>$</span><span class="attribute">result</span><span>=$db-</span><span class="tag">></span><span>query("select * from class");  </span>
</li>
<li>
<span>while($</span><span class="attribute">row</span><span>=$result-</span><span class="tag">></span><span>fetch_assoc()){  </span>
</li>
<li class="alt"><span>$arr[]=array($row[id],$row[f_id],$row[name]); //每一行保存一个<br>分类的id,f_id,name的信息。  </span></li>
<li><span>}  </span></li>
<li class="alt">
<span>function fenlei($</span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">0</span><span>){ //$f_id初始化为0,也就是从最大分类开始循环.  </span>
</li>
<li><span>global $arr; //声明$arr为全局变量才可在函数里引用。  </span></li>
<li class="alt">
<span>for($</span><span class="attribute">i</span><span>=</span><span class="attribute-value">0</span><span>;$i</span><span class="tag">< </span><span class="tag-name">count</span><span>($arr);$i++){ //对每个分类进行循环。  </span>
</li>
<li>
<span>if($arr[$i][1]==$f_id){ //$arr[$i][1]表示第$i+1个分类的f_id的值。<br>开始$</span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">0</span><span>,也就是把</span><span class="attribute">f_id</span><span>=</span><span class="attribute-value">0</span><span>的分类输出来。  </span>
</li>
<li class="alt">
<span>echo $arr[$i][2]."</span><span class="tag">< </span><span class="tag-name">br</span><span class="tag">></span><span>"; //$arr[$i][1]表示第$i+1个分类的name的值。  </span>
</li>
<li><span>fenlei($arr[$i][0]); //$arr[$i][1]表示第$i+1个分类的id的值。进行递归<br>,也就是把自己的id作为f_id参数把自己的子类再循环出来。  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>}  </span></li>
<li class="alt"><span>}  </span></li>
<li><span>fenlei(); //使用这个函数.  </span></li>
<li class="alt">
<span class="tag">?></span><span>  </span>
</li>
</ol>

上記のコード例は、PHP の無制限分類の原理と使用法を詳しく説明しています。


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/446274.html技術記事初心者にとって、PHP には詳細な探索が必要なことがまだたくさんあります。絶えず問題を解決することによってのみ、私たちは誠実さを理解することができます。 PHP 無制限分類とは何ですか?まるで窓のよう…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。