仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1970|回复: 20
打印 上一主题 下一主题

[学习教程] PHP网页设计完成树状布局的两种办法

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:30:07 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的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-5-10 03:31:08 | 显示全部楼层
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-12 09:45

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表