当前位置:Gxlcms > PHP教程 > php创建无限级树型菜单以及三级联动菜单

php创建无限级树型菜单以及三级联动菜单

时间:2021-07-01 10:21:17 帮助过:2人阅读

这篇文章主要介绍了php创建无限级树型菜单 ,主要使用的是递归函数,感兴趣的小伙伴们可以参考一下

写递归函数,可考虑缓存,定义一些静态变量来存上一次运行的结果,多程序运行效率很有帮助.。
大概步骤如下
step1:到数据库取数据,放到一个数组,
step2:把数据转化为一个树型状的数组,
step3:把这个树型状的数组转为html代码。
也可以将第二步和第三步合为一步。
详细如下:
1、数据库设计:

  1. CREATE TABLE `bg_cate` (
  2. `cate_Id` int(30) unsigned NOT NULL AUTO_INCREMENT,
  3. `cate_ParentId` int(30) unsigned DEFAULT '0',
  4. `cate_Name` varchar(100) NOT NULL,
  5. `cate_Intro` varchar(500) DEFAULT NULL,
  6. `cate_Order` int(30) unsigned DEFAULT '0',
  7. `cate_Icon` varchar(100) DEFAULT NULL,
  8. PRIMARY KEY (`cate_Id`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ;
  10. --
  11. -- 导出表中的数据 `bg_cate`
  12. --
  13. INSERT INTO `bg_cate` (`cate_Id`, `cate_ParentId`, `cate_Name`, `cate_Intro`, `cate_Order`, `cate_Icon`) VALUES
  14. (4, 0, '往事如风', '记录往事', 0, 'icons/6.gif'),
  15. (5, 0, '水煮三国', '品位三国智慧', 0, 'icons/3.gif'),
  16. (2, 0, '技术学习', '平时学习的一些笔记,欢迎批评指正。', 0, 'icons/18.gif'),
  17. (3, 0, '生活点滴', '记录生活点滴', 0, 'icons/2.gif'),
  18. (6, 0, '栀子花开', '青春无限', 0, 'icons/8.gif'),
  19. (7, 0, '假日休闲', '悠闲、自在', 0, 'icons/24.gif'),
  20. (8, 2, 'html', 'html学习', 0, 'icons/1.gif'),
  21. (9, 2, 'css', 'css学习', 0, 'icons/1.gif'),
  22. (10, 2, 'php', 'php学习', 0, 'icons/18.gif'),
  23. (11, 10, 'php基础知识', 'php基础知识', 0, 'icons/1.gif'),
  24. (12, 10, 'oop', 'oop', 0, 'icons/1.gif'),
  25. (13, 10, 'php安全', '讲述php安全', 0, 'icons/1.gif'),
  26. (14, 10, 'seagull framework', 'seagull framework', 0, 'icons/1.gif'),
  27. (15, 2, 'javascript', 'javascript学习', 0, 'icons/1.gif'),
  28. (16, 2, '设计模式', NULL, 0, 'icons/1.gif'),
  29. (17, 2, '软件工程', '软件工程学习', 0, 'icons/1.gif'),
  30. (18, 3, '厦门生活', '厦门生活', 0, 'icons/8.gif'),
  31. (19, 3, '大学生活', '大学生活', 0, 'icons/8.gif'),
  32. (20, 3, '童年生活', '童年生活', 0, 'icons/15.gif'),
  33. (21, 19, '学习', '学习', 0, 'icons/1.gif'),
  34. (22, 19, '运动', '运动', 0, 'icons/16.gif'),
  35. (23, 19, '旅游', '旅游', 0, 'icons/24.gif'),
  36. (24, 22, '排球', '排球', 0, 'icons/9.gif'),
  37. (25, 22, '篮球', '篮球', 0, 'icons/9.gif'),
  38. (26, 22, '羽毛球', '羽毛球', 0, 'icons/9.gif'),
  39. (27, 22, '乒乓球', '乒乓球', 0, 'icons/9.gif');

2、到数据库取数据,放到数组:

  1. require_once './classes/MyDB.php';
  2. $con = MyDB::singleton();
  3. $sql = <<<SQL
  4. select * from bg_cate cate
  5. SQL;
  6. $data = $con->getAll($sql);
  7. //print_r($data);

数据库操作我用的是pear类库,最后的$data的数据格式如下:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [cate_Id] => 4
  6. [cate_ParentId] => 0
  7. [cate_Name] => 往事如风
  8. [cate_Intro] => 记录往事
  9. [cate_Order] => 0
  10. [cate_Icon] => icons/6.gif
  11. )
  12. [1] => Array
  13. (
  14. [cate_Id] => 5
  15. [cate_ParentId] => 0
  16. [cate_Name] => 水煮三国
  17. [cate_Intro] => 品位三国智慧
  18. [cate_Order] => 0
  19. [cate_Icon] => icons/3.gif
  20. )

3、把上一步的数据转为树型状的数组代码如下:

  1. function getTree($data, $pId)
  2. {
  3. $tree = '';
  4. foreach($data as $k => $v)
  5. {
  6. if($v['cate_ParentId'] == $pId)
  7. { //父亲找到儿子
  8. $v['cate_ParentId'] = getTree($data, $v['cate_Id']);
  9. $tree[] = $v;
  10. //unset($data[$k]);
  11. }
  12. }
  13. return $tree;
  14. }
  15. $tree = getTree($data, 0);

最后输出$tree的数据格式为:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [cate_Id] => 4
  6. [cate_ParentId] =>
  7. [cate_Name] => 往事如风
  8. [cate_Intro] => 记录往事
  9. [cate_Order] => 0
  10. [cate_Icon] => icons/6.gif
  11. )
  12. [1] => Array
  13. (
  14. [cate_Id] => 5
  15. [cate_ParentId] =>
  16. [cate_Name] => 水煮三国
  17. [cate_Intro] => 品位三国智慧
  18. [cate_Order] => 0
  19. [cate_Icon] => icons/3.gif
  20. )
  21. [2] => Array
  22. (
  23. [cate_Id] => 2
  24. [cate_ParentId] => Array
  25. (
  26. [0] => Array
  27. (
  28. [cate_Id] => 8
  29. [cate_ParentId] =>
  30. [cate_Name] => html
  31. [cate_Intro] => html学习
  32. [cate_Order] => 0
  33. [cate_Icon] => icons/1.gif
  34. )

4、把树型状数组转为html代码如下:

  1. function procHtml($tree)
  2. {
  3. $html = '';
  4. foreach($tree as $t)
  5. {
  6. if($t['cate_ParentId'] == '')
  7. {
  8. $html .= "<li>{$t['cate_Name']}</li>";
  9. }
  10. else
  11. {
  12. $html .= "<li>".$t['cate_Name'];
  13. $html .= procHtml($t['cate_ParentId']);
  14. $html = $html."</li>";
  15. }
  16. }
  17. return $html ? '<ul>'.$html.'</ul>' : $html ;
  18. }
  19. 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步的代码合在一起,代码如下:

  1. function getTree($data, $pId)
  2. {
  3. $html = '';
  4. foreach($data as $k => $v)
  5. {
  6. if($v['cate_ParentId'] == $pId)
  7. { //父亲找到儿子
  8. $html .= "<li>".$v['cate_Name'];
  9. $html .= getTree($data, $v['cate_Id']);
  10. $html = $html."</li>";
  11. }
  12. }
  13. return $html ? '<ul>'.$html.'</ul>' : $html ;
  14. }
  15. echo getTree($data, 0);

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

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

以下是利用php做的三级联动菜单

数据库结构

  1. -- 表的结构 `bigclass`
  2. --
  3. CREATE TABLE `bigclass` (
  4. `bigclassid` int(11) NOT NULL auto_increment,
  5. `bigclassname` varchar(200) collate utf8_unicode_ci NOT NULL,
  6. `sort` int(11) NOT NULL,
  7. `suoshu` int(1) NOT NULL,
  8. PRIMARY KEY (`bigclassid`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=19 ;
  10. -- 表的结构 `smallclass`
  11. --
  12. CREATE TABLE `smallclass` (
  13. `smallclassid` int(11) NOT NULL auto_increment,
  14. `smallclassname` varchar(200) collate utf8_unicode_ci NOT NULL,
  15. `bigclassid` int(11) NOT NULL,
  16. `sort` int(11) NOT NULL,
  17. PRIMARY KEY (`smallclassid`)
  18. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;
  19. -- 表的结构 `minclass`
  20. --
  21. CREATE TABLE `minclass` (
  22. `minclassid` int(10) NOT NULL auto_increment,
  23. `minclassname` varchar(200) NOT NULL,
  24. `bigclassid` int(10) NOT NULL,
  25. `smallclassid` int(10) NOT NULL,
  26. `sort` int(10) NOT NULL,
  27. PRIMARY KEY (`minclassid`)
  28. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

代码如下

  1. <script language = "JavaScript">
  2. var onecount;
  3. onecount=0;
  4. subcat = new Array();
  5. <?
  6. //类别选择
  7. mysql_select_db($database_lr, $lr);
  8. $sql = "select * from smallclass order by sort";
  9. $result = mysql_query( $sql );
  10. $count = 0;
  11. while($res = mysql_fetch_row($result)){
  12. ?>
  13. subcat[<?=$count?>] = new Array("<?=$res[1]?>","<?=$res[4]?>","<?=$res[0]?>");
  14. <?
  15. $count++;
  16. }
  17. ?>
  18. onecount=<?php echo $count?>
  19. //联动函数
  20. function changelocation(bigclassid)
  21. {
  22. document.myform.smallclassid.length = 0;
  23. var bigclassid=bigclassid;
  24. var i;
  25. document.myform.smallclassid.options[0] = new Option('请选择二级分类','');
  26. for (i=0;i < onecount; i++)
  27. {
  28. if (subcat[i][1] == bigclassid)
  29. {
  30. document.myform.smallclassid.options[document.myform.smallclassid.length] = new Option(subcat[i][0], subcat[i][2]);
  31. }
  32. }
  33. }
  34. </script>
  35. <?php
  36. mysql_select_db($database_lr, $lr);
  37. $sql2 = "select * from minclass order by sort";
  38. $result2 = mysql_query( $sql2 );
  39. $count2 = 0;
  40. ?>
  41. <script language = "JavaScript">
  42. //如果这个数组中含有双引号则不能使用。即二级和三级类不能含有双引号
  43. var onecount2;
  44. onecount2=0;
  45. subcat2 = new Array();
  46. <?php
  47. $count2 = 0;
  48. while($res2 = mysql_fetch_row($result2)){
  49. ?>
  50. subcat2[<?php echo $count2?>] = new Array("<?php echo $res2[1]?>","<?php echo $res2[3]?>","<?php echo $res2[0]?>");
  51. <?php
  52. $count2++;
  53. }
  54. ?>
  55. onecount2=<?php echo $count2?>;
  56. function changelocation2(smallclassid)
  57. {
  58. document.myform.minclassid.length = 0;
  59. var smallclassid=smallclassid;
  60. var j;
  61. document.myform.minclassid.options[0] = new Option('请选择三级分类','');
  62. for (j=0;j < onecount2; j++)
  63. {
  64. if (subcat2[j][1] == smallclassid)
  65. {
  66. document.myform.minclassid.options[document.myform.minclassid.length] = new Option(subcat2[j][0], subcat2[j][2]);
  67. }
  68. }
  69. }
  70. </script>
  71. <select name="bigclassid" onChange="changelocation(document.myform.bigclassid.options[document.myform.bigclassid.selectedIndex].value)" size="1">
  72. <option selected value="">请指定一级分类</option>
  73. <?
  74. $sql = "select * from bigclass order by sort";
  75. $result = mysql_query( $sql );
  76. while($res = mysql_fetch_row($result)){
  77. ?>
  78. <option value="<? echo $res[0]; ?>"><? echo $res[1]?></option>
  79. <? } ?>
  80. </select>
  81. <select name="smallclassid" onChange="changelocation2(document.myform.smallclassid.options[document.myform.smallclassid.selectedIndex].value)" size="1">
  82. <option selected value="">请指定二级分类</option>
  83. </select>
  84. <select name="minclassid" size="1">
  85. <option selected value="">==所有三级分类==</option>
  86. </select>

以上就是php创建无限级树型菜单以及三级联动菜单的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行