PHP 實現無限目錄分級

 這幾天好忙,都沒時間寫點東西了,今天中午抽點時間,寫個 無限目錄分級 吧!
好吧,就不耽誤時間了,直接來步驟
    第一步,首先肯定是要建一個存放目錄的表了,表怎麼錄入數據的,我就不說了。我用的是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('&nbsp;&nbsp;', $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羣,羣裏討論...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章