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与已存在的Java应用程序集成
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
将数组写入txt文件 var_export
Apr 21 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
PHP获取中英混合字符串长度的方法
Jun 07 PHP
ThinkPHP实现动态包含文件的方法
Nov 29 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
php中mysql操作buffer用法详解
Mar 19 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
CI框架数据库查询之join用法分析
May 18 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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
PHP 上传文件的方法(类)
2009/07/30 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
javascript之更有效率的字符串替换
2008/08/02 Javascript
JavaScript代码复用模式实例分析
2012/12/02 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
jQuery实现回车键(Enter)切换文本框焦点的代码实例
2014/05/05 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
小程序红包雨的实现示例
2019/02/19 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
python 接口_从协议到抽象基类详解
2017/08/24 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python3多线程知识点总结
2019/09/26 Python
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
初中英语教学反思
2014/01/25 职场文书
五年级英语教学反思
2014/01/31 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书