牛骨文教育服务平台(让学习变的简单)
博文笔记

php实现无限级树型菜单(函数递归算法)

创建时间:2014-04-19 投稿人: 浏览次数:2740

本文来自:http://www.9958.pw/post/php_cat_pid


大概步骤如下: 首先到数据库取数据,放到一个数组, 然后把数据转化为一个树型状的数组, 最后把这个树型状的数组转为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);
2013-08-26
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。