php创建无限级树型菜单


Posted in PHP onNovember 05, 2015

写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。
大概步骤如下
step1:到数据库取数据,放到一个数组,
step2:把数据转化为一个树型状的数组,
step3:把这个树型状的数组转为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);

6、最后再加点css样式,效果如下:

php创建无限级树型菜单

整个过程思路很清晰,非常适合第一次创建无限级树型的朋友学习,希望大家都有所收获。

PHP 相关文章推荐
在PHP中读取和写入WORD文档的代码
Apr 09 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
PHP实现删除非站内外部链接实例代码
Jun 17 PHP
Yii 快速,安全,专业的PHP框架
Sep 03 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
php超快高效率统计大文件行数
Jul 05 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
php实用代码片段整理
Nov 12 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 #PHP
PHP递归创建多级目录
Nov 05 #PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 #PHP
PHP环境中Memcache的安装和使用
Nov 05 #PHP
php生成gif动画的方法
Nov 05 #PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 #PHP
php无限分类使用concat如何实现
Nov 05 #PHP
You might like
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
js 操作select和option常用代码整理
2012/12/13 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
js实现微信分享代码
2020/10/11 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
Python实现的下载网页源码功能示例
2017/06/13 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
几个Shell Script面试题
2012/08/31 面试题
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
学习型党组织心得体会
2014/09/12 职场文书
检讨书范文300字
2015/01/28 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
装修安全责任协议书
2016/03/22 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
python中subplot大小的设置步骤
2021/06/28 Python