php實現(xiàn)無限級分類實現(xiàn)代碼(遞歸方法)
更新時間:2011年01月01日 23:45:46 作者:
近期做的一個網(wǎng)站需要一個無限級下拉列表的無限級分級功能,于是就有了下面的作品。
開始以為這樣的功能似乎很難,之前也做過一個百科的東西,其中也涉及到了分類的功能,不過不是無限級的分類,而是簡單的實現(xiàn)了固定的三級分類,當(dāng)時是自己設(shè)計的,想在想起來實現(xiàn)方法太土了,其實三級分類也只是無限級分類的一種特殊情況而已嘛。經(jīng)過一段時間考慮,已經(jīng)有了一些眉目,到網(wǎng)上一查,原來這樣的東西鋪天蓋地,呵呵。其實無限級下拉列表功能是很簡單的,無非就是用一個遞歸算法就好啦。
首先要設(shè)計數(shù)據(jù)庫,需要建一個表,里面存儲分類信息,至少需要3個字段,第一個是主鍵(ID),第二個是父級分類ID(parentid),第三個是分類的名稱(classname)。可能的一種效果是:
ID PARENTID CLASSNAME
1 0 一級分類A
2 0 一級分類B
3 1 二級分類A
4 1 二級分類B
主要思路:首先看第三行和第四行,父類ID(PARENTID)的值是1,表示屬于id=1這個類的子類,而,一,二兩行因為是一級分類,沒有上級分類,所以父類ID(PARENTID)的值是0,表示初級分類,依次類推便實現(xiàn)了無限級分類。最終的效果是:
├一級分類A
├─┴二級分類A
├─┴二級分類B
├一級分類B
然后就是程序,這里以PHP作為描述語言,可以很方便的改成其他語言,因為原理相似,就是一個遞歸而已。
<?php
$dbhost = "localhost"; // 數(shù)據(jù)庫主機名
$dbuser = "root"; // 數(shù)據(jù)庫用戶名
$dbpd = "123456"; // 數(shù)據(jù)庫密碼
$dbname = "test"; // 數(shù)據(jù)庫名
mysql_connect($dbhost,$dbuser,$dbpd); //連接主機
mysql_select_db($dbname); //選擇數(shù)據(jù)庫
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)) {
// 縮進顯示節(jié)點名稱
echo $tag.$row['classname'] . "<br/>";
//再次調(diào)用這個函數(shù)顯示子節(jié)點的子節(jié)點
display_tree($tag."─┴",$row['id']);
}
}
?>
這樣遞歸方法,對于大量的子欄目是個負擔(dān),一些成熟的cms系統(tǒng)。都是生產(chǎn)數(shù)組方便調(diào)用,也能大幅的提高效率。
首先要設(shè)計數(shù)據(jù)庫,需要建一個表,里面存儲分類信息,至少需要3個字段,第一個是主鍵(ID),第二個是父級分類ID(parentid),第三個是分類的名稱(classname)。可能的一種效果是:
ID PARENTID CLASSNAME
1 0 一級分類A
2 0 一級分類B
3 1 二級分類A
4 1 二級分類B
主要思路:首先看第三行和第四行,父類ID(PARENTID)的值是1,表示屬于id=1這個類的子類,而,一,二兩行因為是一級分類,沒有上級分類,所以父類ID(PARENTID)的值是0,表示初級分類,依次類推便實現(xiàn)了無限級分類。最終的效果是:
├一級分類A
├─┴二級分類A
├─┴二級分類B
├一級分類B
然后就是程序,這里以PHP作為描述語言,可以很方便的改成其他語言,因為原理相似,就是一個遞歸而已。
復(fù)制代碼 代碼如下:
<?php
$dbhost = "localhost"; // 數(shù)據(jù)庫主機名
$dbuser = "root"; // 數(shù)據(jù)庫用戶名
$dbpd = "123456"; // 數(shù)據(jù)庫密碼
$dbname = "test"; // 數(shù)據(jù)庫名
mysql_connect($dbhost,$dbuser,$dbpd); //連接主機
mysql_select_db($dbname); //選擇數(shù)據(jù)庫
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)) {
// 縮進顯示節(jié)點名稱
echo $tag.$row['classname'] . "<br/>";
//再次調(diào)用這個函數(shù)顯示子節(jié)點的子節(jié)點
display_tree($tag."─┴",$row['id']);
}
}
?>
這樣遞歸方法,對于大量的子欄目是個負擔(dān),一些成熟的cms系統(tǒng)。都是生產(chǎn)數(shù)組方便調(diào)用,也能大幅的提高效率。
相關(guān)文章
javascript+php實現(xiàn)根據(jù)用戶時區(qū)顯示當(dāng)?shù)貢r間的方法
這篇文章主要介紹了javascript+php實現(xiàn)根據(jù)用戶時區(qū)顯示當(dāng)?shù)貢r間的方法,實例分析javascript獲取客戶端時區(qū)及與服務(wù)器端php交互的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03PHP實現(xiàn)的無限分類類庫定義與用法示例【基于thinkPHP】
這篇文章主要介紹了PHP實現(xiàn)的無限分類類庫定義與用法,結(jié)合實例形式分析了基于thinkPHP實現(xiàn)的無限分類類庫相關(guān)定義及具體使用操作技巧,需要的朋友可以參考下2018-08-08