$item1 = array( array('name' => 'A', 'url' => 'action.php?action=a'),array('name' => 'B', 'url' => 'action.php?action=b'));
$item2 = array( array('name' => 'C', 'url' => 'action.php?action=c'),array('name' => 'D', 'url' => 'action.php?action=d'));
$item3 = array( array('name' => 'E', 'url' => 'action.php?action=e'),array('name' => 'F', 'url' => 'action.php?action=r'));
$item4 = array( array('name' => 'G', 'url' => 'action.php?action=g'),array('name' => 'H', 'url' => 'action.php?action=h'));
$menu1 = array( array('title' => '高级1', 'item' => $item1),array('title' => '高级2','item' => $item2);
$menu2 = array( array('title' => '高级3', 'item' => $item3),array('title' => '高级4','item' => $item4);
$pmenu = array(array('class'=>'顶级1','menu'=>$menu1),array('class'=>'顶级2','menu'=>$menu2))
现在是想用上面的数组生成如CSDN左侧的树形菜单,只能用php来实现,不能用js或xml。要求树形的每一个节点都能展开和收拢并互不影响。
生成的形式如
顶级1
¦
¦--高级1
¦ ¦
¦ ¦---A
¦ ¦---B
¦
¦--高级2
¦ ¦
¦ ¦---C
¦ ¦---D
¦
顶级2
¦
¦--高级3
¦ ¦
¦ ¦---E
¦ ¦---F
¦
¦--高级4
¦ ¦
¦ ¦---G
¦ ¦---H
本想用函数来实现,没有成功,所以提到这里来了。敬请指教!
---------------------------------------------------------------
先说一点
[要求树形的每一个节点都能展开和收拢并互不影响。]
这个有点困难 用session来记录目前处于打开状态的结点列表吧
讨论一哈
---------------------------------------------------------------
1
2$item1 = array( array('name' => 'A', 'url' => 'action.php?action=a'),array('name' => 'B', 'url' => 'action.php?action=b'));
3$item2 = array( array('name' => 'C', 'url' => 'action.php?action=c'),array('name' => 'D', 'url' => 'action.php?action=d'));
4$item3 = array( array('name' => 'E', 'url' => 'action.php?action=e'),array('name' => 'F', 'url' => 'action.php?action=r'));
5$item4 = array( array('name' => 'G', 'url' => 'action.php?action=g'),array('name' => 'H', 'url' => 'action.php?action=h'));
6
7$menu1 = array( array('title' => '高级1', 'item' => $item1),array('title' => '高级2','item' => $item2));
8$menu2 = array( array('title' => '高级3', 'item' => $item3),array('title' => '高级4','item' => $item4));
9
10$pmenu = array(array('class'=>'顶级1','menu'=>$menu1),array('class'=>'顶级2','menu'=>$menu2));
1<html>
2<head>
3<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
4<title>无标题文档</title>
5<script language="JavaScript">
6<!--
7function clickmenu(thisid){
8obj=eval(thisid);
9if(obj.style.display=="")
10obj.style.display='none';
11else
12obj.style.display='';
13}
14//-->
15</script>
16</head>
17<body>
while(list($key,$class)=each($pmenu)){
1<table border="1" bordercolor="#0066FF" cellspacing="0" width="150">
2<tr>
3<td ```')"="" menu".$key;="" onclick="clickmenu('```
4 echo ">```
5 echo $class["class"];
6```</td>
7</tr>
8<tr>
9<td>
10<div ```"="" id="```
11 echo " menu".$key;="" style="display:none">
while(list($key1,$title)=each($class["menu"])){
1<tr>
2<td ```')"="" menu".$key."item".$key1;="" onclick="clickmenu('```
3 echo ">```
4 echo $title["title"];
5```</td>
6</tr>
7<tr>
8<td>
9<div ```"="" id="```
10 echo " menu".$key."item".$key1;="" style="display:none"><table border="1" bordercolor="#0066FF" cellspacing="0" width="150">
while(list($key2,$name)=each($title["item"])){
1<tr>
2<td>```
3 echo $name["name"];
4```</td>
5</tr>
}
1</table></div>
2</td>
3</tr>
4</table>
}
1</td>
2</tr>
3</table>
}
1</body>
2</html>
---------------------------------------------------------------
to:ustb(偶然)
你用纯php生成不闲效率低吗?每次点hit都要重新生成页面。不划算啊。
---------------------------------------------------------------
1
2session_start();
1<pre>
2方案一
3php版本4.3.2
4设由session保存节点状态信息
5初态:仅显示“顶级”节点
$item1 = array( array('text' => 'A', 'url' => 'action.php?action=a'),array('text' => 'B', 'url' => 'action.php?action=b'));
$item2 = array( array('text' => 'C', 'url' => 'action.php?action=c'),array('text' => 'D', 'url' => 'action.php?action=d'));
$item3 = array( array('text' => 'E', 'url' => 'action.php?action=e'),array('text' => 'F', 'url' => 'action.php?action=r'));
$item4 = array( array('text' => 'G', 'url' => 'action.php?action=g'),array('text' => 'H', 'url' => 'action.php?action=h'));
$menu1 = array( array('text' => '高级1', 'item' => $item1),array('text' => '高级2','item' => $item2));
$menu2 = array( array('text' => '高级3', 'item' => $item3),array('text' => '高级4','item' => $item4));
$pmenu = array(array('text'=>'顶级1','item'=>$menu1),array('text'=>'顶级2','item'=>$menu2));
function tree($menu,$point=-1,$deep=0) {
//构造状态信息
static $info;
static $num;
if($deep == 0) {
$info = array();
$num = 0;
}
foreach($menu as $k=>$v) {
$tmp = $v;
unset($tmp['item']);
$info[] = array(item=>$tmp,deep=>$deep,child=>(is_array($v['item'])?count($v['item']):0));
if(is_array($v['item']))
tree($v['item'],"",$deep+1);
}
if($deep != 0) return;
//至此已将数状的结构平面化了
//print_r($info); // 查看平面化结果
if(! isset($_SESSION['menu_info'])) { // 如果尚未定义菜单状态信息
$menu_info = str_repeat("0",count($info));
$_SESSION['menu_info'] = $menu_info;
}else $menu_info = $_SESSION['menu_info'];
echo "$menu_info\n"; //查看菜单状态信息
//调整菜单状态
if($point >= 0) {
$ch = $menu_info[$point]; //取得指定的节点的状态
$menu_info[$point] = $ch = $ch=="1"?"0":"1"; //置反节点状态
$deep = $info[$point]['deep']; //取得当前的深度
for($i=$point+1;$info[$i]['deep']>$deep;$i++) { //向深度方向
$menu_info[$i] = "0"; //不管三七二十一,先关了再说
}
if($ch == "1") { //如果不是关闭
for($i=$point+1;$info[$i]['deep']>$deep;$i++) { //向深度方向
if($info[$i]['deep'] == $deep+1) {
$menu_info[$i] = "1";
}
}
}
$_SESSION['menu_info'] = $menu_info; //保存修改
}
echo "$menu_info\n"; //再次查看菜单状态信息
//显示菜单
for($i=0;$i<strlen($menu_info);$i++)
if($menu_info[$i] == "1" ¦ ¦ $info[$i]['deep'] == 0) {
echo str_repeat("\t",$info[$i]['deep']).$info[$i]['item']['text'];
if(isset($info[$i]['item']['url']))
echo "[".$info[$i]['item']['url']."]";
else echo "($i)";
echo "\n";
}
}
tree($pmenu);
tree($pmenu,0); //展开第一分支
1不过这样写要被 mikespook(Mike大懒猫) 指责“不遵守软件工程的规范”了
2
3至于如何传递和接收参数就有你决定了</pre>