1. 程式人生 > >php實現無限級樹型選單(函式遞迴演算法)

php實現無限級樹型選單(函式遞迴演算法)

大概步驟如下: 首先到資料庫取資料,放到一個數組, 然後把資料轉化為一個樹型狀的陣列, 最後把這個樹型狀的陣列轉為html程式碼。 也可以將第二步和第三步合為一步。

詳細如下: 1。資料庫設計: 指令碼如下:

CREATE TABLE `bg_cate`(`cate_Id`int(30)unsigned NOT NULL AUTO_INCREMENT,`cate_ParentId`int(30)unsigned DEFAULT '0',`cate_Name` varchar(100) NOT NULL,`cate_Intro` varchar(500) DEFAULT NULL,`cate_Order`
int(30)unsigned DEFAULT '0',`cate_Icon` varchar(100) DEFAULT NULL, PRIMARY KEY (`cate_Id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34;----匯出表中的資料`bg_cate`-- INSERT INTO `bg_cate`(`cate_Id`,`cate_ParentId`,`cate_Name`,`cate_Intro`,`cate_Order`,`cate_Icon`) VALUES (4,0,'往事如風','記錄往事',0,'icons/6.gif'
),(5,0,'水煮三國','品位三國智慧',0,'icons/3.gif'),(2,0,'技術學習','平時學習的一些筆記,歡迎批評指正。',0,'icons/18.gif'),(3,0,'生活點滴','記錄生活點滴',0,'icons/2.gif'),(6,0,'梔子花開','青春無限',0,'icons/8.gif'),(7,0,'假日休閒','悠閒、自在',0,'icons/24.gif'),(8,2,'html','html學習',0,'icons/1.gif'),(9,2,'css','css學習',0,'icons/1.gif'),(10,2,'php','php學習',0,'icons/18.gif'),(11,10,'php基礎知識'
,'php基礎知識',0,'icons/1.gif'),(12,10,'oop','oop',0,'icons/1.gif'),(13,10,'php安全','講述php安全',0,'icons/1.gif'),(14,10,'seagull framework','seagull framework',0,'icons/1.gif'),(15,2,'javascript','javascript學習',0,'icons/1.gif'),(16,2,'設計模式', NULL,0,'icons/1.gif'),(17,2,'軟體工程','軟體工程學習',0,'icons/1.gif'),(18,3,'廈門生活','廈門生活',0,'icons/8.gif'),(19,3,'大學生活','大學生活',0,'icons/8.gif'),(20,3,'童年生活','童年生活',0,'icons/15.gif'),(21,19,'學習','學習',0,'icons/1.gif'),(22,19,'運動','運動',0,'icons/16.gif'),(23,19,'旅遊','旅遊',0,'icons/24.gif'),(24,22,'排球','排球',0,'icons/9.gif'),(25,22,'籃球','籃球',0,'icons/9.gif'),(26,22,'羽毛球','羽毛球',0,'icons/9.gif'),(27,22,'乒乓球','乒乓球',0,'icons/9.gif');

2。到資料庫取資料,放到陣列。

require_once './classes/MyDB.php';
$con =MyDB::singleton(); 
$sql =<<<SQL
    select*from bg_cate cate 
SQL;
$data = $con->getAll($sql);//print_r($data);

資料庫操作我用的是pear類庫。 最後的$data的資料格式如下:

Array([0]=>Array([cate_Id]=>4[cate_ParentId]=>0[cate_Name]=>往事如風[cate_Intro]=>記錄往事[cate_Order]=>0[cate_Icon]=> icons/6.gif)[1]=>Array([cate_Id]=>5[cate_ParentId]=>0[cate_Name]=>水煮三國[cate_Intro]=>品位三國智慧[cate_Order]=>0[cate_Icon]=> icons/3.gif)。。。。。。

3。把上一步的資料轉為樹型狀的陣列 程式碼如下:

function getTree($data, $pId){
$tree ='';foreach($data as $k => $v){if($v['cate_ParentId']== $pId){//父親找到兒子
    $v['cate_ParentId']= getTree($data, $v['cate_Id']);
    $tree[]= $v;//unset($data[$k]);}}return $tree;}
$tree = getTree($data,0);

最後輸出$tree的資料格式為:

Array([0]=>Array([cate_Id]=>4[cate_ParentId]=>[cate_Name]=>往事如風[cate_Intro]=>記錄往事[cate_Order]=>0[cate_Icon]=> icons/6.gif)[1]=>Array([cate_Id]=>5[cate_ParentId]=>[cate_Name]=>水煮三國[cate_Intro]=>品位三國智慧[cate_Order]=>0[cate_Icon]=> icons/3.gif)[2]=>Array([cate_Id]=>2[cate_ParentId]=>Array([0]=>Array([cate_Id]=>8[cate_ParentId]=>[cate_Name]=> html
                            [cate_Intro]=> html學習[cate_Order]=>0[cate_Icon]=> icons/1.gif)。。。。。。。。。。。

4。把樹型狀陣列轉為html 程式碼如下:

function procHtml($tree){
$html ='';foreach($tree as $t){if($t['cate_ParentId']==''){
    $html .="<li>{$t['cate_Name']}</li>";}else{
    $html .="<li>".$t['cate_Name'];
    $html .= procHtml($t['cate_ParentId']);
    $html = $html."</li>";}}return $html ?'<ul>'.$html.'</ul>': $html ;}
echo procHtml($tree);輸出的html的程式碼格式為:<ul><li>往事如風</li><li>水煮三國</li><li>技術學習<ul><li>html</li>
    <li>css</li><li>php
     <ul><li>php基礎知識</li><li>oop</li>
      <li>php安全</li>。。。。。。。。。。。。。。。。5。也可以把第3和第4步的程式碼合在一起,程式碼如下:function getTree($data, $pId){
$html ='';foreach($data as $k => $v){if($v['cate_ParentId']== $pId){//父親找到兒子
    $html .="<li>".$v['cate_Name'];
    $html .= getTree($data, $v['cate_Id']);
    $html = $html."</li>";}}return $html ?'<ul>'.$html.'</ul>': $html ;}
echo getTree($data,0);