1. 程式人生 > >PHP+JS無限級可伸縮選單詳解(遞迴方法)

PHP+JS無限級可伸縮選單詳解(遞迴方法)

-- 

-- 表的結構 `cr_columninfo`

-- 



CREATE TABLE `cr_columninfo` (

  `columnid` int(4) NOT NULL auto_increment,

  `columnfatherid` int(4) NOT NULL default '0',

  `columnname` varchar(100) NOT NULL default '',

  `columnadder` varchar(50) NOT NULL default '',

  `columninputdate` date NOT NULL default '0000-00-00',

  PRIMARY KEY  (`columnid`)

) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;



-- 

-- 匯出表中的資料 `cr_columninfo`

-- 



INSERT INTO `cr_columninfo` (`columnid`, `columnfatherid`, `columnname`, `columnadder`, `columninputdate`) VALUES (1, 0, '影音明星', 'leehui', '2006-09-28'),

(2, 0, '校園風情', 'leehui1983', '2006-09-28'),

(3, 1, '港臺明星', 'leehui', '2006-09-28'),

(4, 0, '風景圖片', 'leehui1983', '2006-09-29'),

(5, 4, '浩瀚大海', 'leehui1983', '2006-09-29'),

(6, 5, '福州的海', 'leehui1983', '2006-09-29'),

(7, 2, '畢業圖片', 'leehui', '2006-09-29'),

(9, 0, '體育明星', 'leehui1983', '2006-10-02'),

(10, 0, '精美桌布', 'leehui1983', '2006-10-02'),

(11, 0, '城市風光', 'leehui1983', '2006-10-02'),

(12, 0, '卡通動漫', 'leehui1983', '2006-10-02'),

(13, 0, '遊戲截圖', 'leehui1983', '2006-10-02'),

(14, 0, '作者相簿', 'leehui1983', '2006-10-02');
這些是測試資料,基本原理就是按照樹型結構建立資料欄位,核心就是欄目都有本身的ID號和父欄目的ID號,依靠這兩個關係,建立樹型結構,頂級欄目父ID=0,這個都好理解,現在來敘述下程式執行原理,本程式採用最為普遍的遞迴演算法來遍歷子,首先,先查詢出所有頂級,顯示在一個大表格里,沒一行顯示一個頂級,再通過遞迴列出所有子,子處在上級的所在行的下一行,且行的顯示屬性為不顯示,通過程式動態生成的行ID號,結合JS控制行的顯示與隱藏,也就是類似於微軟的可伸縮效果,文章最後有張圖有助於大家理解,這是把生成頁面的HTML複製進DW來只管演示程式的最終結果。
來看程式碼部分,並沒有難懂的語法,請大家藉助註釋自己閱讀,有興趣可擴充套件此程式碼。
<html>

<head>

<meta http-equiv="Content-Type" c />

<title>類別目錄樹</title>

<script type="text/javascript">

function ShowMenu(MenuID)

{ 

 if(MenuID.style.display=="none"){ 

    MenuID.style.display=""; 

 } 

 else{ 

 MenuID.style.display="none"; 

 } 

} 

</script>

<link href="style.css" rel="stylesheet" type="text/css">

</head>

<body topmargin="0" bgcolor="#EFEFE7">

<table width="100%" height="25" border="0" cellpadding="0" cellspacing="0" bgcolor="#739E18">

  <tr>

    <td align="left"> <strong>欄目樹形結構列表</strong></td>

  </tr>

</table>

<?php

     //基本變數設定 

     $GLOBALS["ID"] =1; //用來跟蹤下拉選單的ID號 

     $layer=1; //用來跟蹤當前選單的級數 

     //連線資料庫 

     $Con=mysql_connect("localhost","root","fkedwgwy"); 

     mysql_select_db("tree"); 

     mysql_query("SET NAMES 'gbk'");

     //提取一級選單 

     $sql="select * from cr_columninfo where columnfatherid=0"; 

     $result=mysql_query($sql,$Con); 

     //如果一級選單存在則開始選單的顯示 

     if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$ID); 



  //============================================= 

  //顯示樹型選單函式 ShowTreeMenu($con,$result,$layer) 

  //$con:資料庫連線 

  //$result:需要顯示的選單記錄集 

  //$layer:需要顯示的選單的級數 

  //============================================= 

     function ShowTreeMenu($Con,$result,$layer) 

     { 

       //取得需要顯示的選單的專案數 

       $numrows=mysql_num_rows($result); 

       //開始顯示選單,每個子選單都用一個表格來表示 

       echo "<table cellpadding='0' cellspacing='0' border='0' width='100%'>"; 

      for($rows=0;$rows<$numrows;$rows++) 

      { 

        //將當前選單專案的內容匯入陣列 

        $menu=mysql_fetch_array($result); 

        //提取選單專案的子選單記錄集 

        $sql="select * from cr_columninfo where columnfatherid=$menu[columnid]"; 

        $result_sub=mysql_query($sql,$Con); 

        echo "<tr>"; 

        //如果該選單專案有子選單,則新增JavaScript onClick語句 

        if(mysql_num_rows($result_sub)>0) 

        { 

          echo "<td width='20'><img src='plus.JPG' border='0' onClick='javascript:ShowMenu(Menu".$GLOBALS["ID"].");'> </td>"; 

          echo "<td class='Menu' onClick='javascript:ShowMenu(Menu".$GLOBALS["ID"].");'>"; 

        } 

  else{ 

          echo "<td width='20'><img src='plus.JPG' border='0'> </td>"; 

          echo "<td class='Menu'>"; 

        } 

     //如果該選單專案沒有子選單,只顯示選單名稱 

     echo $menu[columnname];

     echo "</td></tr>"; 

     //如果該選單專案有子選單,則顯示子選單 

     if(mysql_num_rows($result_sub)>0) 

     { 

      //指定該子選單的ID和style,以便和onClick語句相對應 

      echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>"; 

      echo "<td width='20'> </td>"; 

      echo "<td>"; 

     //將級數加1 

     $layer++; 

     //遞迴呼叫ShowTreeMenu()函式,生成子選單 

     ShowTreeMenu($Con,$result_sub,$layer); 

     //子選單處理完成,返回到遞迴的上一層

     echo "</td></tr>"; 

     } 

     //子選單處理完成,返回到遞迴的上一層,將級數減1 

     $layer--; 

   } 

     echo "</table>"; 

  } 

?>

</body>

</html>