“无限级树型菜单”的问题,基于PHP+MYSQL+APACHE,请赐教! platinum(代号 铂)谢谢,不过我看了一下你提供的这个程序,是不错,但是树型数据全部都在XML里添加、删除...,MYSQL数据库没有什么作用吧! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 无限级树型菜单在后台你怎么实现都可以啊但是最好生成静态页啊,你想想你的无限级树型菜单,要递归的,数据库可能受不了吧要是只有二三层从数据库里直接到还行,要是层次多了,强烈生成静态页!最简单的表结构如下:id pid name <?php//增加了"target"功能。/** * Tree 类 * 功能 产生"树状"效果的HTML和JavaScript脚本 * 使用方法 见测试例 * 说明 * 1、简化了原版本的默认属性的设置,增加此说明 * 2、缩减了javaScript脚本 **/class Tree { var $data = array(); var $tpl = '<table cellpadding=0 cellspacing=0 border=0 style="font-size:9pt">$块</table>'; var $block = '<tr onClick="tree_onclick()" bs="$标识"><td>$主图标</td><td>$副图标 $文字</td></tr><tr style="display:$可见"><td background="$连线"></td><td value="$编号">$子树</td></tr>'; // 节点图片 var $连线I = "images/tree_I.gif"; var $连线L = "images/tree_L.gif"; var $连线T = "images/tree_T.gif"; var $打开L = "images/OpenFolder_L.gif"; var $打开T = "images/OpenFolder_T.gif"; var $关闭L = "images/CloseFolder_L.gif"; var $关闭T = "images/CloseFolder_T.gif"; var $关闭 = "images/FolderClose.gif"; var $打开 = "images/FolderOpen.gif"; var $叶 = "images/icon-page.gif"; var $bond = "数据加载中..."; // 动态加载子树时的提示串 var $all = false; // 是否产生子树 var $child_node_pos = 1; // 指示子节点出现的位置,js脚本使用。根据模板中"$子树"的位置指定。 /** * Tree 构造函数 * 说明 */ function Tree() { if(func_num_args() > 0) { foreach(func_get_args() as $value) if(is_array($value)) foreach($value as $k=>$v) $this->$k = $v; else { eval(eval("\$this->$value;")); } } $ar = $this->images; $this->images = array( array($this->连线L,$this->连线T,$this->叶), array($this->打开L,$this->打开T,$this->关闭,$this->打开), array($this->关闭L,$this->关闭T,$this->关闭,$this->打开), array("none",$this->连线I), ); if(!is_array($this->bond)) $this->bond = array("",$this->bond); } /** * table 方法 * 功能 产生以表格方式组织的数据 * 说明 主要用于调试 */ function table($format="",$head="") { if(count($this->data) <= 0) return $this->out = ""; $out = "<table $format><tr>"; //$out = "<table $format><tr><th>okkkk</th>></tr><tr>"; if($head == "") { foreach($this->data as $v) break; $head = array_keys($v); } foreach($head as $v) $out .= "<th>$v</th>"; $out .= "</tr>"; foreach($this->data as $value) { $out .= "<tr>"; foreach($head as $k) $out .= "<td>$value[$k]</td>"; $out .= "</tr>"; } return $this->out = "$out</table>"; } /** * node_all 方法 * 功能 根据模板构造全部数据 */ function node_all($id, $key=array("id","pid","text","link","target")) { $this->all = true; return $this->node($id,$key); } /** * index 方法 * 功能 索引树 * 说明 当直接引入数据时,数据的排列可能不符合程序的要求。本方法可以重新排列数据。 */ function index($start=0, $key=array("id","pid")) { $fun = create_function('$a,$b' ,"if(\$a[$key[1]] == \$b[$key[1]]) return 0;" ."return \$a[$key[1]] > \$b[$key[1]]?1:-1;"); $out = array(); foreach($this->data as $k=>$v) { if($v[$key[1]] == $start) $out[] = $v; else $this->insert($v,&$out,$key); } return $this->data = $out; } /** * insert 方法 * 功能 插入节点 */ function insert($value,$array="",$key=array("id","pid")) { if($array == "") $array =& $this->data; if(count($array) <= 0) { $array[] = $value; return true; } $k = $m = $n = 0; $ar = array(); foreach($array as $t) { $k++; if($t[$key[0]] == $value[$key[1]]) $m = $k; if($t[$key[1]] == $value[$key[1]] || in_array($t[$key[1]],$ar)) { $n = $k; $ar[] = $t[$key[0]]; } } $k = max($m,$n); if($k == 0) return false; $array = array_merge(array_slice($array,0,$k),array($value),array_slice($array,$k)); $this->build($key); return true; } /** * javascript 方法 * 功能 送出浏览器javascript脚本 */ function javascript() { static $key; if(! empty($key)) return; $key = 1; // 确保js脚本只输出一次 echo <<< JS<script>function tree_onclick() { el = event.srcElement; switch(event.srcElement.tagName) { case "A": case "IMG": while(el.tagName != "TR") el = el.parentElement; break; default: return; } if(el.bs == 0) return; // bs=0 表示是叶节点; =1 为L接; >1 为T接 var pos = el.rowIndex; var el1 = el.parentElement.rows[pos+1]; if(el1.style.display == "block") { el1.style.display = "none"; el.cells[0].children[0].src = (el.bs==1?"{$this->打开L}":"{$this->打开T}"); if(el.cells[1]) if(el.cells[1].children[0]) el.cells[1].children[0].src = "{$this->关闭}"; }else { el1.style.display = "block"; el.cells[0].children[0].src = (el.bs==1?"{$this->关闭L}":"{$this->关闭T}"); if(el.cells[1]) if(el.cells[1].children[0]) el.cells[1].children[0].src = "{$this->打开}"; } el = el1.cells[{$this->child_node_pos}]; if(el.innerHTML == bond) Tree_load.src = "?node="+el.value;}bond = "{$this->bond[1]}";myload = 0;function tree_load_end() { if(myload != 0) el.innerHTML = myload; }</script><script id='Tree_load' src='' onreadystatechange='tree_load_end()'></script>JS; } function find($id,$key=array("id","pid")) { foreach($this->data as $v) if($v[$key[1]] == $id) return true; return false; } /** * filter方法 * 功能 返回$id的一级子集 */ function filter($id,$key=array("id","pid")) { $cmd = create_function('$var',"return(\$var[$key[1]]=='$id');"); return array_filter($this->data,$cmd); } /** * build方法 * 功能 计算各节点的一级子节点数,用附加的node_childs表示 */ function build($key=array("id","pid")) { foreach($this->data as $k=>$v) { $this->data[$k][node_childs] = count($this->filter($v[$key[0]])); } } /** * node 方法 * 功能 根据模板构造指定节点数据 */ function node($id,$key=array("id","pid","text","link","target")) { $ar = $this->filter($id,$key); if(($n = count($ar)) == 0) return ""; //$块 = ""; foreach($ar as $value) { $n--; $p = sign($value[node_childs]); $可见 = "none";//"block"; $标识 = $p==0 ? $p : $p+$n; $主图标 = "<img src=\"{$this->images[$p][sign($n)]}\" align=absmiddle>"; $副图标 = empty($this->images[$p][2]) ? "" : "<img src=\"{$this->images[$p][2]}\" align=absmiddle>"; $文字 = empty($value[$key[3]]) ? $value[$key[2]] : "<a href=\"{$value[$key[3]]}\" target=\"{$value[$key[4]]}\">{$value[$key[2]]}</a>"; $连线 = $this->images[3][sign($n)]; $编号 = $value[id]; $子树 = $this->all ? $this->node($value[$key[0]],$key) : $this->bond[$p]; $块 .= eval("return \"".AddSlashes($this->block)."\";"); } return eval("return \"\n".AddSlashes($this->tpl)."\";"); } /** * display 方法 * 功能 显示 */ function display($type="node_all",$key=array("id","pid","text","link","target")) { switch($type) { case "table": $this->table(); break; case "node_all": $this->out = $this->node_all(0,$key); break; } $头标志 = "<table width=100% border=0 cellspacing=0 cellpadding=0>"; $头标志 =$头标志."<tr>"; $头标志 =$头标志."<td ><img src=images/opentop.gif name=mid_art width=18 height=18 align=absmiddle>"; $头标志=$头标志." 课件管理列表</td>"; $头标志 =$头标志."</tr>"; $头标志 =$头标志."</table>"; echo $头标志.$this->out; $this->javascript(); }}/*** 符号函数 ***/if (! function_exists('sign')) { function sign($v) { if($v == 0) return 0; return abs($v)/$v; }}?> 建议使用class.treehttp://www.posi.de/非常不错,是目前我最欣赏的小程序了 xqi8(星期八)你这个没有用到数据库吧! 想学PHP,求推荐 replace delayed into 问题 得到近六个月的日期(精确到月),在线等 一个文本编辑器,叫N***++,安装的时候会出现一只大鸟,是台湾人写的,有多国语言版 请问全名叫什么 (初次发言请关照^^)刚遇到的个小问题 php POST 数据怎么自动就给加上“\”.郁闷 关于PHP的排序 PHP里取URL做为参数问题? 如何让PHP页面上的变量传递到HTM页面上????在线等,谢谢! 大神们,谁有空帮我这个PHP新手看看这个PHP问题 请问sum(XXX) 和limit 0,20不用一起用么? 奇怪的sql问题能实现吗??
id pid name
/**
* Tree 类
* 功能 产生"树状"效果的HTML和JavaScript脚本
* 使用方法 见测试例
* 说明
* 1、简化了原版本的默认属性的设置,增加此说明
* 2、缩减了javaScript脚本
**/
class Tree {
var $data = array();
var $tpl = '<table cellpadding=0 cellspacing=0 border=0 style="font-size:9pt">$块</table>';
var $block = '<tr onClick="tree_onclick()" bs="$标识"><td>$主图标</td><td>$副图标 $文字</td></tr><tr style="display:$可见"><td background="$连线"></td><td value="$编号">$子树</td></tr>'; // 节点图片
var $连线I = "images/tree_I.gif";
var $连线L = "images/tree_L.gif";
var $连线T = "images/tree_T.gif";
var $打开L = "images/OpenFolder_L.gif";
var $打开T = "images/OpenFolder_T.gif";
var $关闭L = "images/CloseFolder_L.gif";
var $关闭T = "images/CloseFolder_T.gif";
var $关闭 = "images/FolderClose.gif";
var $打开 = "images/FolderOpen.gif";
var $叶 = "images/icon-page.gif";
var $bond = "数据加载中..."; // 动态加载子树时的提示串
var $all = false; // 是否产生子树
var $child_node_pos = 1; // 指示子节点出现的位置,js脚本使用。根据模板中"$子树"的位置指定。 /**
* Tree 构造函数
* 说明
*/
function Tree() {
if(func_num_args() > 0) {
foreach(func_get_args() as $value)
if(is_array($value))
foreach($value as $k=>$v)
$this->$k = $v;
else {
eval(eval("\$this->$value;"));
}
}
$ar = $this->images;
$this->images = array(
array($this->连线L,$this->连线T,$this->叶),
array($this->打开L,$this->打开T,$this->关闭,$this->打开),
array($this->关闭L,$this->关闭T,$this->关闭,$this->打开),
array("none",$this->连线I),
);
if(!is_array($this->bond))
$this->bond = array("",$this->bond);
} /**
* table 方法
* 功能 产生以表格方式组织的数据
* 说明 主要用于调试
*/
function table($format="",$head="") {
if(count($this->data) <= 0) return $this->out = "";
$out = "<table $format><tr>";
//$out = "<table $format><tr><th>okkkk</th>></tr><tr>";
if($head == "") {
foreach($this->data as $v) break;
$head = array_keys($v);
}
foreach($head as $v)
$out .= "<th>$v</th>";
$out .= "</tr>";
foreach($this->data as $value) {
$out .= "<tr>";
foreach($head as $k)
$out .= "<td>$value[$k]</td>";
$out .= "</tr>";
}
return $this->out = "$out</table>";
} /**
* node_all 方法
* 功能 根据模板构造全部数据
*/
function node_all($id, $key=array("id","pid","text","link","target")) {
$this->all = true;
return $this->node($id,$key);
} /**
* index 方法
* 功能 索引树
* 说明 当直接引入数据时,数据的排列可能不符合程序的要求。本方法可以重新排列数据。
*/
function index($start=0, $key=array("id","pid")) {
$fun = create_function('$a,$b'
,"if(\$a[$key[1]] == \$b[$key[1]]) return 0;"
."return \$a[$key[1]] > \$b[$key[1]]?1:-1;");
$out = array();
foreach($this->data as $k=>$v) {
if($v[$key[1]] == $start)
$out[] = $v;
else
$this->insert($v,&$out,$key);
}
return $this->data = $out;
} /**
* insert 方法
* 功能 插入节点
*/
function insert($value,$array="",$key=array("id","pid")) {
if($array == "") $array =& $this->data;
if(count($array) <= 0) {
$array[] = $value;
return true;
}
$k = $m = $n = 0;
$ar = array();
foreach($array as $t) {
$k++;
if($t[$key[0]] == $value[$key[1]]) $m = $k;
if($t[$key[1]] == $value[$key[1]] || in_array($t[$key[1]],$ar)) {
$n = $k;
$ar[] = $t[$key[0]];
}
}
$k = max($m,$n);
if($k == 0) return false;
$array = array_merge(array_slice($array,0,$k),array($value),array_slice($array,$k));
$this->build($key);
return true;
} /**
* javascript 方法
* 功能 送出浏览器javascript脚本
*/
function javascript() {
static $key;
if(! empty($key)) return;
$key = 1; // 确保js脚本只输出一次
echo <<< JS
<script>
function tree_onclick() {
el = event.srcElement;
switch(event.srcElement.tagName) {
case "A":
case "IMG":
while(el.tagName != "TR") el = el.parentElement;
break;
default:
return;
}
if(el.bs == 0) return; // bs=0 表示是叶节点; =1 为L接; >1 为T接
var pos = el.rowIndex;
var el1 = el.parentElement.rows[pos+1];
if(el1.style.display == "block") {
el1.style.display = "none";
el.cells[0].children[0].src = (el.bs==1?"{$this->打开L}":"{$this->打开T}");
if(el.cells[1]) if(el.cells[1].children[0]) el.cells[1].children[0].src = "{$this->关闭}";
}else {
el1.style.display = "block";
el.cells[0].children[0].src = (el.bs==1?"{$this->关闭L}":"{$this->关闭T}");
if(el.cells[1]) if(el.cells[1].children[0]) el.cells[1].children[0].src = "{$this->打开}";
}
el = el1.cells[{$this->child_node_pos}];
if(el.innerHTML == bond) Tree_load.src = "?node="+el.value;
}
bond = "{$this->bond[1]}";
myload = 0;
function tree_load_end() { if(myload != 0) el.innerHTML = myload; }
</script>
<script id='Tree_load' src='' onreadystatechange='tree_load_end()'></script>
JS;
}
function find($id,$key=array("id","pid")) {
foreach($this->data as $v)
if($v[$key[1]] == $id) return true;
return false;
} /**
* filter方法
* 功能 返回$id的一级子集
*/
function filter($id,$key=array("id","pid")) {
$cmd = create_function('$var',"return(\$var[$key[1]]=='$id');");
return array_filter($this->data,$cmd);
} /**
* build方法
* 功能 计算各节点的一级子节点数,用附加的node_childs表示
*/
function build($key=array("id","pid")) {
foreach($this->data as $k=>$v) {
$this->data[$k][node_childs] = count($this->filter($v[$key[0]]));
}
} /**
* node 方法
* 功能 根据模板构造指定节点数据
*/
function node($id,$key=array("id","pid","text","link","target")) {
$ar = $this->filter($id,$key);
if(($n = count($ar)) == 0) return "";
//$块 = "";
foreach($ar as $value) {
$n--;
$p = sign($value[node_childs]);
$可见 = "none";//"block";
$标识 = $p==0 ? $p : $p+$n;
$主图标 = "<img src=\"{$this->images[$p][sign($n)]}\" align=absmiddle>";
$副图标 = empty($this->images[$p][2]) ? "" : "<img src=\"{$this->images[$p][2]}\" align=absmiddle>";
$文字 = empty($value[$key[3]]) ? $value[$key[2]] : "<a href=\"{$value[$key[3]]}\" target=\"{$value[$key[4]]}\">{$value[$key[2]]}</a>";
$连线 = $this->images[3][sign($n)]; $编号 = $value[id];
$子树 = $this->all ? $this->node($value[$key[0]],$key) : $this->bond[$p];
$块 .= eval("return \"".AddSlashes($this->block)."\";");
}
return eval("return \"\n".AddSlashes($this->tpl)."\";");
} /**
* display 方法
* 功能 显示
*/
function display($type="node_all",$key=array("id","pid","text","link","target")) {
switch($type) {
case "table":
$this->table();
break;
case "node_all":
$this->out = $this->node_all(0,$key);
break;
}
$头标志 = "<table width=100% border=0 cellspacing=0 cellpadding=0>";
$头标志 =$头标志."<tr>";
$头标志 =$头标志."<td ><img src=images/opentop.gif name=mid_art width=18 height=18 align=absmiddle>";
$头标志=$头标志." 课件管理列表</td>";
$头标志 =$头标志."</tr>";
$头标志 =$头标志."</table>";
echo $头标志.$this->out;
$this->javascript();
}
}/*** 符号函数 ***/
if (! function_exists('sign')) {
function sign($v) {
if($v == 0) return 0;
return abs($v)/$v;
}
}
?>
非常不错,是目前我最欣赏的小程序了