关于用数组生成树形菜单的问题,请高手指教。

$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
¦
&brvbar--高级1
¦ ¦
¦ &brvbar---A
¦ &brvbar---B
¦
&brvbar--高级2
¦ ¦
¦ &brvbar---C
¦ &brvbar---D
¦
顶级2
¦
&brvbar--高级3
¦ ¦
¦ &brvbar---E
¦ &brvbar---F
¦
&brvbar--高级4
¦ ¦
¦ &brvbar---G
¦ &brvbar---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' =&gt; 'A', 'url' =&gt; 'action.php?action=a'),array('text' =&gt; 'B', 'url' =&gt; 'action.php?action=b'));
$item2 = array( array('text' =&gt; 'C', 'url' =&gt; 'action.php?action=c'),array('text' =&gt; 'D', 'url' =&gt; 'action.php?action=d'));
$item3 = array( array('text' =&gt; 'E', 'url' =&gt; 'action.php?action=e'),array('text' =&gt; 'F', 'url' =&gt; 'action.php?action=r'));
$item4 = array( array('text' =&gt; 'G', 'url' =&gt; 'action.php?action=g'),array('text' =&gt; 'H', 'url' =&gt; 'action.php?action=h'));

$menu1 = array( array('text' =&gt; '高级1', 'item' =&gt; $item1),array('text' =&gt; '高级2','item' =&gt; $item2));
$menu2 = array( array('text' =&gt; '高级3', 'item' =&gt; $item3),array('text' =&gt; '高级4','item' =&gt; $item4));

$pmenu = array(array('text'=&gt;'顶级1','item'=&gt;$menu1),array('text'=&gt;'顶级2','item'=&gt;$menu2));

function tree($menu,$point=-1,$deep=0) {
//构造状态信息
static $info;
static $num;
if($deep == 0) {
$info = array();
$num = 0;
}
foreach($menu as $k=&gt;$v) {
$tmp = $v;
unset($tmp['item']);
$info[] = array(item=&gt;$tmp,deep=&gt;$deep,child=&gt;(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 &gt;= 0) {
$ch = $menu_info[$point]; //取得指定的节点的状态
$menu_info[$point] = $ch = $ch=="1"?"0":"1"; //置反节点状态

$deep = $info[$point]['deep']; //取得当前的深度
for($i=$point+1;$info[$i]['deep']&gt;$deep;$i++) { //向深度方向
$menu_info[$i] = "0"; //不管三七二十一,先关了再说
}
if($ch == "1") { //如果不是关闭
for($i=$point+1;$info[$i]['deep']&gt;$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&lt;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>
Published At
Categories with Web编程
comments powered by Disqus