«
用php理论上实现真正意义的无限级别菜单

时间:2008-5-31    作者:Deri    分类: 分享


   <p>  很久没用php了,为了加深数据结构的基本知识(为考试准备),练习一下基本的算法,当然还是为了以后使用php做菜单的时候免得麻烦。</p><p>  算法:数据结构中的最基本的树与二叉树的转换</p><p>  大家凑合着看吧!因为只是为了熟悉一下算法,没有做具体的测试,同时对数据库的操作没有封装成类,大家如果需要可以自行修改或者和我联系!</p><p>  Your data must save like this:</p><p>  id,topic,child_l,parent,child_r,content</p><p>  file name:</p><p>  show.inc.php</p><p>  codes:</p><p>  ==================================================</p><p>  <code><?<br />class shows{<br />  
    var $items;<br />  
    var $the_stack;<br />  
    var $count=0;<br />         &#160;<br />  
    function find($l_value) {<br />    
    for($j=1;$j<=$this->items["info_all"];$j++) {<br />      
    if($l_value==$this->items["d_id][$j]"])<br />      
    { return($j);exit; }<br />           &#160;<br />    
    }<br />             &#160;<br />  
    }<br />           &#160;<br />           &#160;<br />  
    function m_l_r_list($i) {<br />         &#160;<br />    
    if(($this->items["f_node][$i]"]==0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]!=-1))<br />    
    {//if it is root node!!!<br />      
    echo "<table><tr><td>";<br />      
    echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."ALL\" NAME=\"NAME_".$i."ALL\">";<br />      
    echo "<a href=\"".$this->pages_0($this->items["d_id][$i]"])."?d_id=".$this->items["d_id][$i]"]."\" target=\"rightFrame\">".$this->items["node_value][$i]"]."</a>";<br />      
    echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />      
    echo "</td></tr></table>";<br />      
    echo "<div class=collapsed id=".$i."ALL>";<br />      
    $i=$this->find($this->items["l_node][$i]"]);<br />      
    $this->count=$this->count+2;<br />      
    $this->m_l_r_list($i);<br />      
    exit;<br />    
    }<br />    
    if(($this->items["f_node][$i]"]==0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]==-1))<br />    
    {<br />      
    exit;<br />    
    }<br />            &#160;if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]!=0)&&($this->items["l_node][$i]"]!=0))<br />            &#160;{//if node have left and right child<br />              &#160;$current_node=$this->items["d_id][$i]"];<br />              &#160;<br />              &#160;if(($this->items["l_node][$i]"]==-1)&&($this->items["r_node][$i]"]==-1)) {<br />        
    $i=$this->find($this->items["f_node][$i]"]);<br />        
    if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point<br />          
    $this->items["r_node][$i]"]=-1;<br />        
    }<br />        
    if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point<br />          
    $this->items["l_node][$i]"]=-1;<br />        
    }<br />        
    $this->count=$this->count-2;<br />        
    $this->m_l_r_list($i);<br />      
    }//if left child and right child have been visited up to his parent node<br />             &#160;<br />              &#160;if(($this->items["l_node][$i]"]!=-1)&&($this->items["r_node][$i]"]!=-1)) {<br />        
    echo "<table><tr><td>";<br />        
    for ($k=0;$k<$this->count;$k++) { echo " ";}<br />        
    echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."ALL\" NAME=\"NAME_".$i."ALL\">";<br />        
    echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightFrame\">".$this->items["node_value][$i]"]."</a>";<br />        
    //echo $this->items["node_value][$i]"];<br />        
    echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />        
    echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>Del</font></a>";<br />        
    echo "</td></tr></table>";<br />        
    echo "<div class=collapsed id=".$i."ALL>";<br />        
    $i=$this->find($this->items["l_node][$i]"]);//visite left child node<br />                &#160;$this->count=$this->count+2;<br />                &#160;$this->m_l_r_list($i);<br />      
    }//if left child node and right child node have not been visited<br />              &#160;<br />              &#160;if(($this->items["l_node][$i]"]==-1)&&($this->items["r_node][$i]"]!=-1)) {<br />                &#160;$i=$this->find($this->items["r_node][$i]"]);//visite right child node<br />                &#160;$this->m_l_r_list($i);<br />      
    }//if left child node have been visited and right child node have not been visited  &#160;<br />              &#160;<br />            &#160;}<br />            &#160;<br />    
    if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]!=0))<br />    
    {//if node only have left child<br />      
    $current_node=$this->items["d_id][$i]"];<br />      
    if($this->items["l_node][$i]"]!=-1) {<br />        
    echo "<table><tr><td>";<br />        
    for ($k=0;$k<$this->count;$k++) { echo " ";}<br />        
    echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."ALL\" NAME=\"NAME_".$i."ALL\">";<br />        
    echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightFrame\">".$this->items["node_value][$i]"]."</a>";<br />        
    //echo $this->items["node_value][$i]"];<br />        
    echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />        
    echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>Del</font></a>";<br />        
    echo "</td></tr></table>";<br />        
    echo "<div class=collapsed id=".$i."ALL>";<br />        
    $i=$this->find($this->items["l_node][$i]"]);//visite left child node<br />        
    $this->count=$this->count+2;<br />        
    $this->m_l_r_list($i);<br />        
    exit;<br />      
    }//if his left child node have not been visited<br />             &#160;<br />      
    if($this->items["l_node][$i]"]==-1) {<br />        
    echo "</div>";<br />        
    $i=$this->find($this->items["f_node][$i]"]);<br />        
    if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point<br />          
    $this->items["r_node][$i]"]=-1;<br />        
    }<br />        
    if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point<br />          
    $this->items["l_node][$i]"]=-1;<br />          
    $this->count=$this->count-2;<br />        
    }<br />        
    $this->m_l_r_list($i);<br />        
    exit;<br />      
    }//if his left child node have been visite,up to his parent node<br />             &#160;<br />    
    }<br />    
    if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]!=0)&&($this->items["l_node][$i]"]==0))<br />    
    {//if node only have right child<br />      
    $current_node=$this->items["d_id][$i]"];<br />      
    $j=$this->find($this->items["f_node][$i]"]);<br />      
    if($this->items["r_node][$i]"]!=-1) {<br />        
    echo "<table><tr><td>";<br />        
    for ($k=0;$k<$this->count;$k++) { echo " ";}<br />        
    echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightFrame\">".$this->items["node_value][$i]"]."</a>";<br />        
    //echo $this->items["node_value][$i]"];<br />        
    echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />        
    echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>Del</font></a>";<br />        
    echo "</td></tr></table>";<br />        
    $i=$this->find($this->items["r_node][$i]"]);//visite right child node<br />        
    $this->m_l_r_list($i);<br />        
    exit;<br />      
    }//if his right child node have not been visited<br />             &#160;<br />      
    if($this->items["r_node][$i]"]==-1) {<br />        
    $i=$this->find($this->items["f_node][$i]"]);<br />        
    if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point<br />          
    $this->items["r_node][$i]"]=-1;<br />        
    }<br />        
    if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point<br />          
    $this->items["l_node][$i]"]=-1;<br />          
    $this->count=$this->count-2;<br />        
    }<br />        
    $this->m_l_r_list($i);<br />        
    exit;<br />      
    }//if his right child node have been visite,up to his parent node<br />             &#160;<br />             &#160;<br />    
    }<br />    
    if(($this->items["f_node][$i]"]!=0)&&($this->items["l_node][$i]"]==0)&&($this->items["r_node][$i]"]==0))<br />    
    {//if this node haven't child node,print it and up to his parent<br />            &#160;//node his parent left or right child have been visited<br />      
    $current_node=$this->items["d_id][$i]"];<br />      
    $j=$i;<br />      
    $i=$this->find($this->items["f_node][$i]"]);//up to parent<br />      
    //echo $this->items["l_node][$i]"];<br />      
    if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point<br />        
    echo "<table><tr><td>";<br />        
    for ($k=0;$k<$this->count;$k++) { echo " ";}<br />        
    echo "<a href=\"main.php?d_id=".$this->items["d_id][$j]"]."\" target=\"rightFrame\">".$this->items["node_value][$j]"]."</a>";<br />        
    //echo $this->items["node_value][$j]"];<br />        
    echo " <a href=addnode.php?id=".$this->items["d_id][$j]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />        
    echo " <a href=delnode.php?id=".$this->items["d_id][$j]"]."><font size=2 color=red>Del</font></a>";<br />        
    echo "</td></tr></table>";<br />        
    echo "</div>";<br />        
    $this->items["r_node][$i]"]=-1;<br />                 &#160;<br />      
    }<br />      
    if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point<br />               &#160;<br />        
    echo "<table><tr><td>";<br />        
    for ($k=0;$k<$this->count;$k++) { echo " ";}<br />        
    echo "<a href=\"main.php?d_id=".$this->items["d_id][$j]"]."\" target=\"rightFrame\">".$this->items["node_value][$j]"]."</a>";<br />        
    //echo $this->items["node_value][$j]"];<br />        
    echo " <a href=addnode.php?id=".$this->items["d_id][$j]"]." target=\"rightFrame\"><font size=2 color=red>Add</font></a>";<br />        
    echo " <a href=delnode.php?id=".$this->items["d_id][$j]"]."><font size=2 color=red>Del</font></a>";<br />        
    echo "</td></tr></table>";<br />        
    echo "</div>";<br />        
    $this->items["l_node][$i]"]=-1;<br />        
    $this->count=$this->count-2;<br />               &#160;<br />      
    }<br />      
    $this->m_l_r_list($i);<br />      
    exit;<br />    
    }<br />         &#160;<br />  
    }<br />         &#160;<br />  
    function pages_0($d_id){//<br />    
    include("conn_db.php");<br />    
    $Sql_Query="select * from node_page where d_id=$d_id";<br />    
    $Query_Db=mysql_query($Sql_Query,$Connect);<br />    
    $MyPage=mysql_fetch_array($Query_Db);     &#160;<br />    
    include("conn_close.php");<br />    
    if($MyPage["d_page"]!='')<br />      
    {<br />        
    return $MyPage["d_page"];<br />      
    } &#160;<br />    
    else return "init.php";<br />    
    }<br />  
    function pages($d_id){//<br />    
    include("conn_db.php");<br />    
    $Sql_Query="select * from node_page where d_id=$d_id";<br />    
    $Query_Db=mysql_query($Sql_Query,$Connect);<br />    
    $MyPage=mysql_fetch_array($Query_Db);     &#160;<br />    
    include("conn_close.php");<br />    
    return $MyPage["d_page"];<br />    
    } &#160;<br />           &#160;<br />  
    function showinfo_0($status){//<br />    
    include("conn_db.php");<br />    
    $Sql_Query="select * from department order by d_id";<br />    
    $Query_Db=mysql_query($Sql_Query,$Connect);<br />    
    $info_all=mysql_num_rows($Query_Db);<br />    
    $this->items["info_all"]=$info_all;<br />    
    if($status==1) {//when status=1 show all data gets from database<br />      
    $MNums=$info_all;<br />      
    }<br />    
    if($status==0) {//when status=0 show 6 messages gets from database<br />      
    $MNums=6;<br />      
    }<br />    
    for($i=1;$i<=$MNums;$i++)<br />      
    {<br />      
    $Messages=mysql_fetch_array($Query_Db);<br />      
    $this->items["d_id][$i]"]=$Messages["d_id"];<br />      
    $this->items["f_node][$i]"]=$Messages["f_node"];<br />      
    $this->items["node_value][$i]"]=$Messages["node_value"];<br />      
    $this->items["l_node][$i]"]=$Messages["l_node"];<br />      
    $this->items["r_node][$i]"]=$Messages["r_node"];<br />      
    }<br />    
    include("conn_close.php");<br />    
    } &#160;<br />}</code></p>