php创建无限级树型菜单以及三级联动菜单-程序员宅基地

技术标签: php  

http://www.php.cn/php-weizijiaocheng-373500.html

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

 

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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、到数据库取数据,放到数组:

1

2

3

4

5

6

7

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的数据格式如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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、把上一步的数据转为树型状的数组代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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的数据格式为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

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步的代码合在一起,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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做的三级联动菜单

数据库结构

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

-- 表的结构 `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 ;

代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

<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创建无限级树型菜单以及三级联动菜单的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/james_laughing/article/details/91351955

智能推荐

FTP命令字和返回码_ftp 登录返回230-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏13次。为了从FTP服务器下载文件,需要要实现一个简单的FTP客户端。FTP(文件传输协议) 是 TCP/IP 协议组中的应用层协议。FTP协议使用字符串格式命令字,每条命令都是一行字符串,以“\r\n”结尾。客户端发送格式是:命令+空格+参数+"\r\n"的格式服务器返回格式是以:状态码+空格+提示字符串+"\r\n"的格式,代码只要解析状态码就可以了。读写文件需要登陆服务器,特殊用..._ftp 登录返回230

centos7安装rabbitmq3.6.5_centos7 安装rabbitmq3.6.5-程序员宅基地

文章浏览阅读648次。前提:systemctl stop firewalld 关闭防火墙关闭selinux查看getenforce临时关闭setenforce 0永久关闭sed-i'/SELINUX/s/enforcing/disabled/'/etc/selinux/configselinux的三种模式enforcing:强制模式,SELinux 运作中,且已经正确的开始限制..._centos7 安装rabbitmq3.6.5

idea导入android工程,idea怎样导入Android studio 项目?-程序员宅基地

文章浏览阅读5.8k次。满意答案s55f2avsx2017.09.05采纳率:46%等级:12已帮助:5646人新版Android Studio/IntelliJ IDEA可以直接导入eclipse项目,不再推荐使用eclipse导出gradle的方式2启动Android Studio/IntelliJ IDEA,选择 import project3选择eclipse 项目4选择 create project f..._android studio 项目导入idea 看不懂安卓项目

浅谈AI大模型技术:概念、发展和应用_ai大模型应用开发-程序员宅基地

文章浏览阅读860次,点赞2次,收藏6次。AI大模型技术已经在自然语言处理、计算机视觉、多模态交互等领域取得了显著的进展和成果,同时也引发了一系列新的挑战和问题,如数据质量、计算效率、知识可解释性、安全可靠性等。城市运维涉及到多个方面,如交通管理、环境监测、公共安全、社会治理等,它们需要处理和分析大量的多模态数据,如图像、视频、语音、文本等,并根据不同的场景和需求,提供合适的决策和响应。知识搜索有多种形式,如语义搜索、对话搜索、图像搜索、视频搜索等,它们可以根据用户的输入和意图,从海量的数据源中检索出最相关的信息,并以友好的方式呈现给用户。_ai大模型应用开发

非常详细的阻抗测试基础知识_阻抗实部和虚部-程序员宅基地

文章浏览阅读8.2k次,点赞12次,收藏121次。为什么要测量阻抗呢?阻抗能代表什么?阻抗测量的注意事项... ...很多人可能会带着一系列的问题来阅读本文。不管是数字电路工程师还是射频工程师,都在关注各类器件的阻抗,本文非常值得一读。全文13000多字,认真读完大概需要2小时。一、阻抗测试基本概念阻抗定义:阻抗是元器件或电路对周期的交流信号的总的反作用。AC 交流测试信号 (幅度和频率)。包括实部和虚部。​图1 阻抗的定义阻抗是评测电路、元件以及制作元件材料的重要参数。那么什么是阻抗呢?让我们先来看一下阻抗的定义。首先阻抗是一个矢量。通常,阻抗是_阻抗实部和虚部

小学生python游戏编程arcade----基本知识1_arcade语言 like-程序员宅基地

文章浏览阅读955次。前面章节分享试用了pyzero,pygame但随着想增加更丰富的游戏内容,好多还要进行自己编写类,从今天开始解绍一个新的python游戏库arcade模块。通过此次的《连连看》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。_arcade语言 like

随便推点

口述历史:Andrew Viterbi-程序员宅基地

文章浏览阅读353次。IEEE对于维特比(高通公司联合创始人)的访谈_andrew viterbi

【增强版短视频去水印源码】去水印微信小程序+去水印软件源码_去水印机要增强版-程序员宅基地

文章浏览阅读1.1k次。源码简介与安装说明:2021增强版短视频去水印源码 去水印微信小程序源码网站 去水印软件源码安装环境(需要材料):备案域名–服务器安装宝塔-安装 Nginx 或者 Apachephp5.6 以上-安装 sg11 插件小程序已自带解析接口,支持全网主流短视频平台,搭建好了就能用注:接口是公益的,那么多人用解析慢是肯定的,前段和后端源码已经打包,上传服务器之后在配置文件修改数据库密码。然后输入自己的域名,进入后台,创建小程序,输入自己的小程序配置即可安装说明:上传源码,修改data/_去水印机要增强版

verilog进阶语法-触发器原语_fdre #(.init(1'b0) // initial value of register (1-程序员宅基地

文章浏览阅读557次。1. 触发器是FPGA存储数据的基本单元2. 触发器作为时序逻辑的基本元件,官方提供了丰富的配置方式,以适应各种可能的应用场景。_fdre #(.init(1'b0) // initial value of register (1'b0 or 1'b1) ) fdce_osc (

嵌入式面试/笔试C相关总结_嵌入式面试笔试c语言知识点-程序员宅基地

文章浏览阅读560次。本该是不同编译器结果不同,但是尝试了g++ msvc都是先计算c,再计算b,最后得到a+b+c是经过赋值以后的b和c参与计算而不是6。由上表可知,将q复制到p数组可以表示为:*p++=*q++,*优先级高,先取到对应q数组的值,然后两个++都是在后面,该行运算完后执行++。在电脑端编译完后会分为text data bss三种,其中text为可执行程序,data为初始化过的ro+rw变量,bss为未初始化或初始化为0变量。_嵌入式面试笔试c语言知识点

57 Things I've Learned Founding 3 Tech Companies_mature-程序员宅基地

文章浏览阅读2.3k次。57 Things I've Learned Founding 3 Tech CompaniesJason Goldberg, Betashop | Oct. 29, 2010, 1:29 PMI’ve been founding andhelping run techn_mature

一个脚本搞定文件合并去重,大数据处理,可以合并几个G以上的文件_python 超大文本合并-程序员宅基地

文章浏览阅读1.9k次。问题:先讲下需求,有若干个文本文件(txt或者csv文件等),每行代表一条数据,现在希望能合并成 1 个文本文件,且需要去除重复行。分析:一向奉行简单原则,如无必要,绝不复杂。如果数据量不大,那么如下两条命令就可以搞定合并:cat a.txt >> new.txtcat b.txt >> new.txt……去重:cat new...._python 超大文本合并

推荐文章

热门文章

相关标签