這幾天好忙,都沒時間寫點東西了,今天中午抽點時間,寫個 無限目錄分級 吧!
好吧,就不耽誤時間了,直接來步驟
第一步,首先肯定是要建一個存放目錄的表了,表怎麼錄入數據的,我就不說了。我用的是mysql數據庫
我把表放在test數據庫裏,你們可以隨便,但記得改下面我貼的代碼裏面的數據庫名
CREATE TABLE IF NOT EXISTS `node` (
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '欄目名',
`p_id` int(8) NOT NULL COMMENT '父結點',
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
--
-- 導出表中的數據 `node`
--
INSERT INTO `node` (`id`, `name`, `p_id`) VALUES
(1, '第一級 1', 0),
(2, '第一級 2', 0),
(3, '第一級 3', 0),
(4, '第一級 4', 0),
(5, '第二級 1-1', 1),
(6, '第二級 1-2', 1),
(7, '第二級 2-1', 2),
(8, '第二級 2-2', 2),
(9, '第二級 3-1', 3),
(10, '第二級 4-1', 4),
(11, '第三級 1-1-1', 5),
(12, '第三級 1-1-2', 6),
(13, '第三級 2-1-1', 7);
把以上的代碼,複製粘貼成 node.sql ,在導入數據庫,怎麼導入的,我也不說了,真的不會的話,就在網上找一下吧,改天再寫個貼,關於mysql操作的吧
第二步,就是要寫代碼了,我自己都已經寫好了,也測試過了,可以運行!把代碼貼上吧!
就叫 test.php吧 直接把數據全部提取出來,然後再進行處理
<?php
$conn = mysql_connect( 'localhost', 'root', '111111' ); //用戶名和密碼改成自己相應的
mysql_select_db( 'test', $conn ); //數據庫也是的,改成自己的
mysql_query("set names 'utf8'");
$sql = "select id, name,p_id from node"; //表的名字如果沒有動的話,這裏就不要動了
$query = mysql_query( $sql );
$level = 0;
while( $rs = mysql_fetch_array( $query ) )
{
$rs['isChild'] = '';
$group[] = $rs; //把所有數據都保存到 $group 裏,然後進行處理
}
// 下面這二個函數進行處理
/**
* 判斷節點是否有子節點
*
* @param array $arr 要序列化的數組
* @param int $pid 節點ID
* @return boolean
*/
function existsChild($arr, $pid)
{
foreach ($arr as $val)
{
if($val['p_id'] == $pid)
{
return true;
}
}
return false;
}
/**
* 序列化樹
*
* @param array $arr 要序列化的數組
* @param int $pid 第一層父類ID,我這時初始化爲0
* @param int $repeat 分級間隔
* @return array
*/
function getClass($arr, $pid = 0, $repeat = 0)
{
foreach ($arr as $key => $val)
{
if($val['p_id'] == $pid)
{
$arrChild = array();
if($pid != 0)
{
$repeat++;
}
$str = str_repeat(' ', $repeat);
$arr[$key]['isChild'] = $str;
$array[] = $arr[$key];
if(existsChild($arr, $val['id']))
{
$arrChild = getClass($arr, $val['id'], $repeat);
}
$array = array_merge($array, $arrChild);
if($pid != 0)
{
$repeat--;
}
}
}
if(!is_array($array))
{
return array();
}
return $array;
}
?>
然後
$arrTree = getClass($group); //這就OK了
然後打印出 $arrTree 就可以了!
<!-- 下面這段js是實現子目錄的開關狀態的 -->
<script type="text/javascript">
function opennode( id )
{
if( document.getElementById( id ).style.display == 'none' )
{
document.getElementById( id ).style.display = 'block';
}
else
{
document.getElementById( id ).style.display = 'none';
}
}
</script>
<style type="text/css">
<!--
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:active {
text-decoration: none;
}
-->
</style>
忘了說了,我用的是國際標準編碼utf-8,如果不想用utf-8的話,1. 需要在第一步裏把表的編碼改爲你想要用的編碼。 2. 在第二步裏把頁面編碼統一爲你想用的編碼。 但強調一點,要保持編碼統一!
運行一下,如果不出意思的話,應該是OK的。
如果還不行的話,可以加我blog裏的QQ羣,羣裏討論...