一.数据库设计

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'​​​​);​

二.到数据库取数据,放到数组。

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​​​​​​​​)​

三.把上一步的数据转为树型状的数组

代码如下:

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​​​​​​​​)​

四.把树型状数组转为html

代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

​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的代码格式为:

1 2 3 4 5 6 7 8 9 10 11 12

​<​​​​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​​​​>​

五.代码整合

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);​