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应用程序来获取Web服务器的状态信息
Oct 09 PHP
php垃圾代码优化操作代码
Aug 05 PHP
PHP中去除换行解决办法小结(PHP_EOL)
Nov 27 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php的ajax简单实例
Feb 27 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
PHP实现一个按钮点击上传多个图片操作示例
Jan 23 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程序的方法小结
2012/02/23 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
QUnit jQuery的TDD框架
2010/11/04 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
2020/01/02 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python3.x中自定义比较函数
2015/04/24 Python
使用Python的内建模块collections的教程
2015/04/28 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python实现端口检测的方法
2018/07/24 Python
关于numpy数组轴的使用详解
2019/12/05 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
python使用建议与技巧分享(二)
2020/08/17 Python
python tkinter实现连连看游戏
2020/11/16 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
毕业生在校学习的自我评价分享
2013/10/08 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
村委会贫困证明
2014/01/14 职场文书
出国留学计划书
2014/04/27 职场文书
公司领导班子对照材料
2014/08/18 职场文书
教师个人总结范文
2015/02/11 职场文书
一封真诚的自荐信帮你赢得机会
2019/05/07 职场文书