php實(shí)現(xiàn)無(wú)限級(jí)分類(lèi)實(shí)現(xiàn)代碼(遞歸方法)
更新時(shí)間:2011年01月01日 23:45:46 作者:
近期做的一個(gè)網(wǎng)站需要一個(gè)無(wú)限級(jí)下拉列表的無(wú)限級(jí)分級(jí)功能,于是就有了下面的作品。
開(kāi)始以為這樣的功能似乎很難,之前也做過(guò)一個(gè)百科的東西,其中也涉及到了分類(lèi)的功能,不過(guò)不是無(wú)限級(jí)的分類(lèi),而是簡(jiǎn)單的實(shí)現(xiàn)了固定的三級(jí)分類(lèi),當(dāng)時(shí)是自己設(shè)計(jì)的,想在想起來(lái)實(shí)現(xiàn)方法太土了,其實(shí)三級(jí)分類(lèi)也只是無(wú)限級(jí)分類(lèi)的一種特殊情況而已嘛。經(jīng)過(guò)一段時(shí)間考慮,已經(jīng)有了一些眉目,到網(wǎng)上一查,原來(lái)這樣的東西鋪天蓋地,呵呵。其實(shí)無(wú)限級(jí)下拉列表功能是很簡(jiǎn)單的,無(wú)非就是用一個(gè)遞歸算法就好啦。
首先要設(shè)計(jì)數(shù)據(jù)庫(kù),需要建一個(gè)表,里面存儲(chǔ)分類(lèi)信息,至少需要3個(gè)字段,第一個(gè)是主鍵(ID),第二個(gè)是父級(jí)分類(lèi)ID(parentid),第三個(gè)是分類(lèi)的名稱(chēng)(classname)??赡艿囊环N效果是:
ID PARENTID CLASSNAME
1 0 一級(jí)分類(lèi)A
2 0 一級(jí)分類(lèi)B
3 1 二級(jí)分類(lèi)A
4 1 二級(jí)分類(lèi)B
主要思路:首先看第三行和第四行,父類(lèi)ID(PARENTID)的值是1,表示屬于id=1這個(gè)類(lèi)的子類(lèi),而,一,二兩行因?yàn)槭且患?jí)分類(lèi),沒(méi)有上級(jí)分類(lèi),所以父類(lèi)ID(PARENTID)的值是0,表示初級(jí)分類(lèi),依次類(lèi)推便實(shí)現(xiàn)了無(wú)限級(jí)分類(lèi)。最終的效果是:
├一級(jí)分類(lèi)A
├─┴二級(jí)分類(lèi)A
├─┴二級(jí)分類(lèi)B
├一級(jí)分類(lèi)B
然后就是程序,這里以PHP作為描述語(yǔ)言,可以很方便的改成其他語(yǔ)言,因?yàn)樵硐嗨疲褪且粋€(gè)遞歸而已。
<?php
$dbhost = "localhost"; // 數(shù)據(jù)庫(kù)主機(jī)名
$dbuser = "root"; // 數(shù)據(jù)庫(kù)用戶(hù)名
$dbpd = "123456"; // 數(shù)據(jù)庫(kù)密碼
$dbname = "test"; // 數(shù)據(jù)庫(kù)名
mysql_connect($dbhost,$dbuser,$dbpd); //連接主機(jī)
mysql_select_db($dbname); //選擇數(shù)據(jù)庫(kù)
mysql_query("SET NAMES 'utf8'");
display_tree("├",0);
function display_tree($tag,$classid) {
$result = mysql_query("
SELECT *
FROM ylmf_class
WHERE parentid = '" . $classid . "'
;"
);
while ($row = mysql_fetch_array($result)) {
// 縮進(jìn)顯示節(jié)點(diǎn)名稱(chēng)
echo $tag.$row['classname'] . "<br/>";
//再次調(diào)用這個(gè)函數(shù)顯示子節(jié)點(diǎn)的子節(jié)點(diǎn)
display_tree($tag."─┴",$row['id']);
}
}
?>
這樣遞歸方法,對(duì)于大量的子欄目是個(gè)負(fù)擔(dān),一些成熟的cms系統(tǒng)。都是生產(chǎn)數(shù)組方便調(diào)用,也能大幅的提高效率。
首先要設(shè)計(jì)數(shù)據(jù)庫(kù),需要建一個(gè)表,里面存儲(chǔ)分類(lèi)信息,至少需要3個(gè)字段,第一個(gè)是主鍵(ID),第二個(gè)是父級(jí)分類(lèi)ID(parentid),第三個(gè)是分類(lèi)的名稱(chēng)(classname)??赡艿囊环N效果是:
ID PARENTID CLASSNAME
1 0 一級(jí)分類(lèi)A
2 0 一級(jí)分類(lèi)B
3 1 二級(jí)分類(lèi)A
4 1 二級(jí)分類(lèi)B
主要思路:首先看第三行和第四行,父類(lèi)ID(PARENTID)的值是1,表示屬于id=1這個(gè)類(lèi)的子類(lèi),而,一,二兩行因?yàn)槭且患?jí)分類(lèi),沒(méi)有上級(jí)分類(lèi),所以父類(lèi)ID(PARENTID)的值是0,表示初級(jí)分類(lèi),依次類(lèi)推便實(shí)現(xiàn)了無(wú)限級(jí)分類(lèi)。最終的效果是:
├一級(jí)分類(lèi)A
├─┴二級(jí)分類(lèi)A
├─┴二級(jí)分類(lèi)B
├一級(jí)分類(lèi)B
然后就是程序,這里以PHP作為描述語(yǔ)言,可以很方便的改成其他語(yǔ)言,因?yàn)樵硐嗨疲褪且粋€(gè)遞歸而已。
復(fù)制代碼 代碼如下:
<?php
$dbhost = "localhost"; // 數(shù)據(jù)庫(kù)主機(jī)名
$dbuser = "root"; // 數(shù)據(jù)庫(kù)用戶(hù)名
$dbpd = "123456"; // 數(shù)據(jù)庫(kù)密碼
$dbname = "test"; // 數(shù)據(jù)庫(kù)名
mysql_connect($dbhost,$dbuser,$dbpd); //連接主機(jī)
mysql_select_db($dbname); //選擇數(shù)據(jù)庫(kù)
mysql_query("SET NAMES 'utf8'");
display_tree("├",0);
function display_tree($tag,$classid) {
$result = mysql_query("
SELECT *
FROM ylmf_class
WHERE parentid = '" . $classid . "'
;"
);
while ($row = mysql_fetch_array($result)) {
// 縮進(jìn)顯示節(jié)點(diǎn)名稱(chēng)
echo $tag.$row['classname'] . "<br/>";
//再次調(diào)用這個(gè)函數(shù)顯示子節(jié)點(diǎn)的子節(jié)點(diǎn)
display_tree($tag."─┴",$row['id']);
}
}
?>
這樣遞歸方法,對(duì)于大量的子欄目是個(gè)負(fù)擔(dān),一些成熟的cms系統(tǒng)。都是生產(chǎn)數(shù)組方便調(diào)用,也能大幅的提高效率。
相關(guān)文章
javascript+php實(shí)現(xiàn)根據(jù)用戶(hù)時(shí)區(qū)顯示當(dāng)?shù)貢r(shí)間的方法
這篇文章主要介紹了javascript+php實(shí)現(xiàn)根據(jù)用戶(hù)時(shí)區(qū)顯示當(dāng)?shù)貢r(shí)間的方法,實(shí)例分析javascript獲取客戶(hù)端時(shí)區(qū)及與服務(wù)器端php交互的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03利用PHP訪(fǎng)問(wèn)帶有密碼的Redis方法示例
這篇文章主要介紹了利用PHP如何訪(fǎng)問(wèn)帶有密碼的Redis,文章開(kāi)始先介紹了如何設(shè)置Redis密碼及方法帶密碼的Redis,方便大家學(xué)習(xí)和理解,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02PHP防范SQL注入的具體方法詳解(測(cè)試通過(guò))
PHP防范SQL注入是一個(gè)非常重要的安全手段。相信大家對(duì)這一安全防范方法還不是很了解,希望通過(guò)本文介紹的內(nèi)容大家能夠充分掌握這一知識(shí)點(diǎn)2014-05-05PHP實(shí)現(xiàn)的無(wú)限分類(lèi)類(lèi)庫(kù)定義與用法示例【基于thinkPHP】
這篇文章主要介紹了PHP實(shí)現(xiàn)的無(wú)限分類(lèi)類(lèi)庫(kù)定義與用法,結(jié)合實(shí)例形式分析了基于thinkPHP實(shí)現(xiàn)的無(wú)限分類(lèi)類(lèi)庫(kù)相關(guān)定義及具體使用操作技巧,需要的朋友可以參考下2018-08-08