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 相关文章推荐
中国站长站 For Dede4.0 采集规则
May 27 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
php递归删除目录下的文件但保留的实例分享
May 10 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
php 数组随机取值的简单实例
May 23 PHP
PHP基于Closure类创建匿名函数的方法详解
Aug 17 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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代码优化及php相关问题总结
2006/10/09 PHP
PHP与javascript的两种交互方式
2006/10/09 PHP
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
HTML Dom与Css控制方法
2010/10/25 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python使用urllib模块开发的多线程豆瓣小站mp3下载器
2014/01/16 Python
python实现八大排序算法(1)
2017/09/14 Python
python实现简易通讯录修改版
2018/03/13 Python
python之生产者消费者模型实现详解
2019/07/27 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
python中enumerate() 与zip()函数的使用比较实例分析
2019/09/03 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
智能室内花园:Click & Grow
2021/01/29 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
元旦文艺汇演主持词
2014/03/26 职场文书
产品推广策划方案
2014/05/10 职场文书
公司副总经理任命书
2014/06/05 职场文书