分享
 
 
 

用PHP程序实现树状结构的两种方法

王朝php·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有