<?php
//基本变量设置
$GLOBALS["ID"] =1; //用来跟踪下拉菜单的ID号
$layer=1; //用来跟踪当前菜单的级数 //连接数据库
require ("../class/class.mysql.connection.php");
require ("../class/define.table.field.php");
$mysql_server = new mysql_connection($hostname, $username, $password, $database);
$mysql_server->open();
$Con = $mysql_server->mysql_link;
//提取一级菜单
$sql="select * from staffer_structure where parent_id=0";
$result = $mysql_server->send_result_sql($sql,0);//如果一级菜单存在则开始菜单的显示
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$layer,$ID); //=============================================
//显示树型菜单函数 ShowTreeMenu($con,$result,$layer)
//$con:数据库连接
//$result:需要显示的菜单记录集
//layer:需要显示的菜单的级数
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要显示的菜单的项目数
$numrows=mysql_num_rows($result); //开始显示菜单,每个子菜单都用一个表格来表示
echo "<table cellpadding='0' cellspacing='0' border='0'>\n"; for($rows=0;$rows<$numrows;$rows++)
{
//将当前菜单项目的内容导入数组
$menu=mysql_fetch_array($result); //提取菜单项目的子菜单记录集
$sql="select * from staffer_structure where parent_id=$menu[id]";
$result_sub = mysql_query($sql,$Con);echo "<tr>";
//如果该菜单项目有子菜单,则添加JavaScript onClick语句
if(mysql_num_rows($result_sub)>0)
{
echo "<td width='20'><img src='images/.gif' border='0'></td>\n";
echo "<td>\n";
echo "<font class='Menu' onClick='javascript:ShowMenu(Menu".$GLOBALS["ID"].");'>\n";
}
else
{
echo "<td width='20'><img src='images/file.gif' border='0'></td>\n";
echo "<td>";
echo "<font class='Mvenu'>";
}
//如果该菜单项目没有子菜单,
//否则只显示菜单名称
echo trim($menu[name]);
echo "</font>\n";
echo "
<a href=\"javascript:add_click('".$menu[id]."','".$menu[parent_id]."');\">
<font color=black><nobr> 添加子组织机构</nobr></font></a>
<a href=\"javascript:modify_click('".$menu[id]."','".$menu[parent_id]."');\">
<font color=black><nobr>修改 </nobr></font></a>
<a href=\"javascript:del_click('".$menu[id]."','$page');\">
<font color=black><nobr>删除</nobr></font></a>
</td>
</tr>
"; //如果该菜单项目有子菜单,则显示子菜单
if(mysql_num_rows($result_sub)>0)
{
//指定该子菜单的ID和style,以便和onClick语句相对应
echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>\n";
echo "<td width='20'> </td>\n";
echo "<td>\n";
//将级数加1
$layer++;
//递归调用ShowTreeMenu()函数,生成子菜单
ShowTreeMenu($Con,$result_sub,$layer);
//子菜单处理完成,返回到递归的上一层,将级数减1
$layer--;
echo "</td></tr>\n";
}
//继续显示下一个菜单项目
}
echo "</table>\n";
}
?>------------------------------------------
TreeMenu.js
function ShowMenu(MenuID)
{
if(MenuID.style.display=="none")
{
MenuID.style.display="";
}
else
{
MenuID.style.display="none";
}
}
//基本变量设置
$GLOBALS["ID"] =1; //用来跟踪下拉菜单的ID号
$layer=1; //用来跟踪当前菜单的级数 //连接数据库
require ("../class/class.mysql.connection.php");
require ("../class/define.table.field.php");
$mysql_server = new mysql_connection($hostname, $username, $password, $database);
$mysql_server->open();
$Con = $mysql_server->mysql_link;
//提取一级菜单
$sql="select * from staffer_structure where parent_id=0";
$result = $mysql_server->send_result_sql($sql,0);//如果一级菜单存在则开始菜单的显示
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$layer,$ID); //=============================================
//显示树型菜单函数 ShowTreeMenu($con,$result,$layer)
//$con:数据库连接
//$result:需要显示的菜单记录集
//layer:需要显示的菜单的级数
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要显示的菜单的项目数
$numrows=mysql_num_rows($result); //开始显示菜单,每个子菜单都用一个表格来表示
echo "<table cellpadding='0' cellspacing='0' border='0'>\n"; for($rows=0;$rows<$numrows;$rows++)
{
//将当前菜单项目的内容导入数组
$menu=mysql_fetch_array($result); //提取菜单项目的子菜单记录集
$sql="select * from staffer_structure where parent_id=$menu[id]";
$result_sub = mysql_query($sql,$Con);echo "<tr>";
//如果该菜单项目有子菜单,则添加JavaScript onClick语句
if(mysql_num_rows($result_sub)>0)
{
echo "<td width='20'><img src='images/.gif' border='0'></td>\n";
echo "<td>\n";
echo "<font class='Menu' onClick='javascript:ShowMenu(Menu".$GLOBALS["ID"].");'>\n";
}
else
{
echo "<td width='20'><img src='images/file.gif' border='0'></td>\n";
echo "<td>";
echo "<font class='Mvenu'>";
}
//如果该菜单项目没有子菜单,
//否则只显示菜单名称
echo trim($menu[name]);
echo "</font>\n";
echo "
<a href=\"javascript:add_click('".$menu[id]."','".$menu[parent_id]."');\">
<font color=black><nobr> 添加子组织机构</nobr></font></a>
<a href=\"javascript:modify_click('".$menu[id]."','".$menu[parent_id]."');\">
<font color=black><nobr>修改 </nobr></font></a>
<a href=\"javascript:del_click('".$menu[id]."','$page');\">
<font color=black><nobr>删除</nobr></font></a>
</td>
</tr>
"; //如果该菜单项目有子菜单,则显示子菜单
if(mysql_num_rows($result_sub)>0)
{
//指定该子菜单的ID和style,以便和onClick语句相对应
echo "<tr id=Menu".$GLOBALS["ID"]++." style='display:none'>\n";
echo "<td width='20'> </td>\n";
echo "<td>\n";
//将级数加1
$layer++;
//递归调用ShowTreeMenu()函数,生成子菜单
ShowTreeMenu($Con,$result_sub,$layer);
//子菜单处理完成,返回到递归的上一层,将级数减1
$layer--;
echo "</td></tr>\n";
}
//继续显示下一个菜单项目
}
echo "</table>\n";
}
?>------------------------------------------
TreeMenu.js
function ShowMenu(MenuID)
{
if(MenuID.style.display=="none")
{
MenuID.style.display="";
}
else
{
MenuID.style.display="none";
}
}
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=MyISAMINSERT 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);?>--------------------------------------------------------------------------------