php实现无限级树型菜单(函数递归算法)
本文来自: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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: C++学习011-常用内存分配及释放函数
- 下一篇: php 从数据库读取数据并生成树型可折叠菜单