仓酷云

标题: PHP网页设计完成树状布局的两种办法 [打印本页]

作者: 莫相离    时间: 2015-2-4 00:30
标题: PHP网页设计完成树状布局的两种办法
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。   完成树状布局的两种办法
1。递归法
递归是指在函数中显式的挪用它本身。
使用递归法完成树状布局的特色是写入数据速度较快,显示速度较慢(在树的分支/条理较多的情形下特别分明)。合用与写入数据量大,树的布局庞杂的情形下。
数据布局(以mysql为例)

代码:--------------------------------------------------------------------------------
CREATE TABLE `tree1` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL default '0',
`topic` varchar(50) default NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`)
) TYPE=MyISAM;

INSERT INTO `tree1` (`id`, `parentid`, `topic`) VALUES
(1,0,'树1'),
(2,0,'树2'),
(3,0,'树3'),
(4,2,'树2-1'),
(5,4,'树2-1-1'),
(6,2,'树2-2'),
(7,1,'树1-1'),
(8,1,'树1-2'),
(9,1,'树1-3'),
(10,8,'树1-2-1'),
(11,7,'树1-1-1'),
(12,11,'树1-1-1-1');
--------------------------------------------------------------------------------


字段申明
id,纪录的id号
parentid,纪录的父纪录id(为0则为根纪录)
topic,纪录的显示题目

显示法式

按次树:

PHP代码:--------------------------------------------------------------------------------

<?
/* 数据库毗连 */
mysql_connect();
mysql_select_db('tree');

/* 树状显示的递归函数 */
function tree($parentid = 0) {
/*履行sql查询,获得纪录的题目和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id asc";
$rs = mysql_query($sql);
/* 缩进*/
echo("<ul>");
while($ra = mysql_fetch_row($rs)) {
/* 显示纪录题目 */
echo('<li>'.$ra[0].'</li>');
/* 递归挪用 */
tree($ra[1]);
}
echo("</ul>");
}
tree();
?>

--------------------------------------------------------------------------------


逆序树:

PHP代码:--------------------------------------------------------------------------------

<?
/* 数据库毗连 */
mysql_connect();
mysql_select_db('tree');

/* 树状显示的递归函数 */
function tree($parentid = 0) {
/*履行sql查询,获得纪录的题目和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id desc";
$rs = mysql_query($sql);
/* 缩进*/
echo("<ul>");
while($ra = mysql_fetch_row($rs)) {
/* 显示纪录题目 */
echo('<li>'.$ra[0].'</li>');
/* 递归挪用 */
tree($ra[1]);
}
echo("</ul>");
}
tree();
?>

--------------------------------------------------------------------------------


拔出数据法式

PHP代码:--------------------------------------------------------------------------------

<?
/* 数据库毗连 */
mysql_connect();
mysql_select_db('tree');
$sql = "insert into tree (topic,parentid) values('树3-1',3);";
mysql_query($sql);
?>

--------------------------------------------------------------------------------


2。排序字段法
此办法是经由过程在数据布局中增添一个标记纪录在全部树中的按次地位的字段来完成的。特色是显示速度和效力高。但在单个树的布局庞杂的情形下,数据写入效力有所缺乏。并且按次分列时分,拔出,删除纪录的算法过于庞杂,故凡是用逆序分列。

数据布局(以mysql为例)

代码:--------------------------------------------------------------------------------
CREATE TABLE `tree2` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL default '0',
`rootid` tinyint(3) unsigned NOT NULL default '0',
`layer` tinyint(3) unsigned NOT NULL default '0',
`orders` tinyint(3) unsigned NOT NULL default '0',
`topic` varchar(50) default NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`),
KEY `rootid` (`rootid`)
) TYPE=MyISAM

INSERT INTO `tree2` (`id`, `parentid`, `rootid`, `layer`, `orders`, `topic`) VALUES
(1,0,1,0,0,'树1'),
(2,0,2,0,0,'树2'),
(3,0,3,0,0,'树3'),
(4,2,2,1,2,'树2-1'),
(5,4,2,2,3,'树2-1-1'),
(6,2,2,1,1,'树2-2'),
(7,1,1,1,4,'树1-1'),
(8,1,1,1,2,'树1-2'),
(9,1,1,1,1,'树1-3'),
(10,8,1,2,3,'树1-2-1'),
(11,7,1,2,5,'树1-1-1'),
(12,11,1,3,6,'树1-1-1-1');
--------------------------------------------------------------------------------


显示法式

PHP代码:--------------------------------------------------------------------------------

<?
/* 数据库毗连 */
mysql_connect();
mysql_select_db('tree');

/* 选出一切根纪录id */
$sql = "select id from tree2 where parentid = 0 order by id desc";
$rs = mysql_query($sql);
echo("<ul>");
$lay = 0;
while($ra = mysql_fetch_row($rs)) {
echo("<ul>");
/* 选出此树一切纪录,并按orders字段排序 */
$sql = "select topic,layer from tree2 where rootid = $ra[0] order by orders";
$rs1 = mysql_query($sql);
while($ra1 = mysql_fetch_row($rs1)) {
/* 缩进显示 */
if($ra1[1]>$lay) {
echo(str_repeat("<ul>",$ra1[1]-$lay));
}elseif($ra1[1]<$lay) {
echo(str_repeat("</ul>",$lay-$ra1[1]));
}
/* 纪录显示 */
//echo("$ra1[1]>$lay");
echo("<li>$ra1[0]</li>");
$lay = $ra1[1];
}
echo("</ul>");
}
echo("</ul>");
?>

--------------------------------------------------------------------------------


拔出数据法式

PHP代码:--------------------------------------------------------------------------------

<?
/* 数据库毗连 */
mysql_connect();
mysql_select_db('tree');

/* 拔出根纪录 */
$sql = "insert into tree2 (topic) values ('树5')";
mysql_query($sql);
$sql = "update tree2 set rootid = id where id = ".mysql_insert_id();
mysql_query($sql);

/* 拔出子纪录 */
$parentid = 5;//父纪录id
/* 掏出 根纪录id,父纪录缩进条理,父纪录按次地位 */
$sql = "select rootid,layer,orders from tree2 where id = $parentid";
list($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
/* 更新拔出地位跋文录的orders值 */
$sql = "update tree2 set orders = orders + 1 where orders > $orders";
mysql_query($sql);
/* 拔出纪录 */
$sql = "insert into tree2 (rootid,parentid,orders,layer,topic) values ($rootid,$parentid,".($orders+1).",".($layer+1).",'树2-1-1-2')";
mysql_query($sql);?>

  也或许是因为我还没有真正的学到深处吧,说实在的,PHP中的很多高级点的应用,如PHP类、PHP函数基本还是不懂吧!
作者: 小女巫    时间: 2015-2-4 13:14
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 愤怒的大鸟    时间: 2015-2-9 23:16
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 简单生活    时间: 2015-2-10 04:21
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 活着的死人    时间: 2015-2-18 15:36
爱上php,他也会爱上你。
作者: 灵魂腐蚀    时间: 2015-3-6 08:23
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者: 深爱那片海    时间: 2015-3-11 16:21
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 飘灵儿    时间: 2015-3-12 11:52
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
作者: 飘飘悠悠    时间: 2015-3-12 16:22
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 蒙在股里    时间: 2015-3-14 14:38
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 冷月葬花魂    时间: 2015-3-17 11:08
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 柔情似水    时间: 2015-3-17 21:36
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者: 分手快乐    时间: 2015-3-25 03:08
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 因胸联盟    时间: 2015-4-4 17:15
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 精灵巫婆    时间: 2015-4-5 00:42
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 再见西城    时间: 2015-4-20 12:39
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 金色的骷髅    时间: 2015-4-22 05:15
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
作者: 莫相离    时间: 2015-5-10 03:31
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 乐观    时间: 2015-5-11 22:07
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 爱飞    时间: 2015-6-8 10:08
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 老尸    时间: 2015-6-10 23:23
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2