时间:2021-07-01 10:21:17 帮助过:2人阅读
写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。
大概步骤如下:
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代码如下:
输出的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>
- 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);
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做的三级联动菜单
数据库结构
- -- 表的结构 `bigclass`
- --
- CREATE TABLE `bigclass` (
- `bigclassid` int(11) NOT NULL auto_increment,
- `bigclassname` varchar(200) collate utf8_unicode_ci NOT NULL,
- `sort` int(11) NOT NULL,
- `suoshu` int(1) NOT NULL,
- PRIMARY KEY (`bigclassid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=19 ;
- -- 表的结构 `smallclass`
- --
- CREATE TABLE `smallclass` (
- `smallclassid` int(11) NOT NULL auto_increment,
- `smallclassname` varchar(200) collate utf8_unicode_ci NOT NULL,
- `bigclassid` int(11) NOT NULL,
- `sort` int(11) NOT NULL,
- PRIMARY KEY (`smallclassid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;
- -- 表的结构 `minclass`
- --
- CREATE TABLE `minclass` (
- `minclassid` int(10) NOT NULL auto_increment,
- `minclassname` varchar(200) NOT NULL,
- `bigclassid` int(10) NOT NULL,
- `smallclassid` int(10) NOT NULL,
- `sort` int(10) NOT NULL,
- PRIMARY KEY (`minclassid`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
代码如下
- <script language = "JavaScript">
- var onecount;
- onecount=0;
- subcat = new Array();
- <?
- //类别选择
- mysql_select_db($database_lr, $lr);
- $sql = "select * from smallclass order by sort";
- $result = mysql_query( $sql );
- $count = 0;
- while($res = mysql_fetch_row($result)){
- ?>
- subcat[<?=$count?>] = new Array("<?=$res[1]?>","<?=$res[4]?>","<?=$res[0]?>");
- <?
- $count++;
- }
- ?>
- onecount=<?php echo $count?>
- //联动函数
- function changelocation(bigclassid)
- {
- document.myform.smallclassid.length = 0;
- var bigclassid=bigclassid;
- var i;
- document.myform.smallclassid.options[0] = new Option('请选择二级分类','');
- for (i=0;i < onecount; i++)
- {
- if (subcat[i][1] == bigclassid)
- {
- document.myform.smallclassid.options[document.myform.smallclassid.length] = new Option(subcat[i][0], subcat[i][2]);
- }
- }
- }
- </script>
- <?php
- mysql_select_db($database_lr, $lr);
- $sql2 = "select * from minclass order by sort";
- $result2 = mysql_query( $sql2 );
- $count2 = 0;
- ?>
- <script language = "JavaScript">
- //如果这个数组中含有双引号则不能使用。即二级和三级类不能含有双引号
- var onecount2;
- onecount2=0;
- subcat2 = new Array();
- <?php
- $count2 = 0;
- while($res2 = mysql_fetch_row($result2)){
- ?>
- subcat2[<?php echo $count2?>] = new Array("<?php echo $res2[1]?>","<?php echo $res2[3]?>","<?php echo $res2[0]?>");
- <?php
- $count2++;
- }
- ?>
- onecount2=<?php echo $count2?>;
- function changelocation2(smallclassid)
- {
- document.myform.minclassid.length = 0;
- var smallclassid=smallclassid;
- var j;
- document.myform.minclassid.options[0] = new Option('请选择三级分类','');
- for (j=0;j < onecount2; j++)
- {
- if (subcat2[j][1] == smallclassid)
- {
- document.myform.minclassid.options[document.myform.minclassid.length] = new Option(subcat2[j][0], subcat2[j][2]);
- }
- }
- }
- </script>
- <select name="bigclassid" onChange="changelocation(document.myform.bigclassid.options[document.myform.bigclassid.selectedIndex].value)" size="1">
- <option selected value="">请指定一级分类</option>
- <?
- $sql = "select * from bigclass order by sort";
- $result = mysql_query( $sql );
- while($res = mysql_fetch_row($result)){
- ?>
- <option value="<? echo $res[0]; ?>"><? echo $res[1]?></option>
- <? } ?>
- </select>
- <select name="smallclassid" onChange="changelocation2(document.myform.smallclassid.options[document.myform.smallclassid.selectedIndex].value)" size="1">
- <option selected value="">请指定二级分类</option>
- </select>
- <select name="minclassid" size="1">
- <option selected value="">==所有三级分类==</option>
- </select>
以上就是php创建无限级树型菜单以及三级联动菜单的详细内容,更多请关注Gxl网其它相关文章!