动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   PHP → 阅读文章

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

作者来源: 
阅读 1482 人次 , 2006-3-29 4:08:00 


很久没用php了,为了加深数据结构的基本知识(为考试准备),练习一下基本的算法,当然还是为了以后使用php做菜单的时候免得麻烦。
算法:数据结构中的最基本的树与二叉树的转换
大家凑合着看吧!因为只是为了熟悉一下算法,没有做具体的测试,同时对数据库的操作没有封装成类,大家如果需要可以自行修改或者和我联系!


your data must save like this:
id,topic,child_l,parent,child_r,content

file name:
show.inc.php
codes:
==================================================
<?

class shows{
var $items;
var $the_stack;
var $count=0;


function find($l_value) {
for($j=1;$j<=$this->items["info_all"];$j++) {
if($l_value==$this->items["d_id][$j]"])
{ return($j);exit; }

}

}


function m_l_r_list($i) {

if(($this->items["f_node][$i]"]==0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]!=-1))
{//if it is root node!!!
echo "<table><tr><td>";
echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."all\" name=\"name_".$i."all\">";
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>";
echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo "</td></tr></table>";
echo "<div class=collapsed id=".$i."all>";
$i=$this->find($this->items["l_node][$i]"]);
$this->count=$this->count+2;
$this->m_l_r_list($i);
exit;
}
if(($this->items["f_node][$i]"]==0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]==-1))
{
exit;
}
 if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]!=0)&&($this->items["l_node][$i]"]!=0))
 {//if node have left and right child
 $current_node=$this->items["d_id][$i]"];
 
 if(($this->items["l_node][$i]"]==-1)&&($this->items["r_node][$i]"]==-1)) {
$i=$this->find($this->items["f_node][$i]"]);
if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point
$this->items["r_node][$i]"]=-1;
}
if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point
$this->items["l_node][$i]"]=-1;
}
$this->count=$this->count-2;
$this->m_l_r_list($i);
}//if left child and right child have been visited up to his parent node

 if(($this->items["l_node][$i]"]!=-1)&&($this->items["r_node][$i]"]!=-1)) {
echo "<table><tr><td>";
for ($k=0;$k<$this->count;$k++) { echo " ";}
echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."all\" name=\"name_".$i."all\">";
echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightframe\">".$this->items["node_value][$i]"]."</a>";
//echo $this->items["node_value][$i]"];
echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>del</font></a>";
echo "</td></tr></table>";
echo "<div class=collapsed id=".$i."all>";
$i=$this->find($this->items["l_node][$i]"]);//visite left child node
 $this->count=$this->count+2;
 $this->m_l_r_list($i);
}//if left child node and right child node have not been visited
 
 if(($this->items["l_node][$i]"]==-1)&&($this->items["r_node][$i]"]!=-1)) {
 $i=$this->find($this->items["r_node][$i]"]);//visite right child node
 $this->m_l_r_list($i);
}//if left child node have been visited and right child node have not been visited  
 
 }
 
if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]==0)&&($this->items["l_node][$i]"]!=0))
{//if node only have left child
$current_node=$this->items["d_id][$i]"];
if($this->items["l_node][$i]"]!=-1) {
echo "<table><tr><td>";
for ($k=0;$k<$this->count;$k++) { echo " ";}
echo "<img id=image".$i." src=\"c.gif\" onclick=outliner() style=\"cursor:hand\" child=\"".$i."all\" name=\"name_".$i."all\">";
echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightframe\">".$this->items["node_value][$i]"]."</a>";
//echo $this->items["node_value][$i]"];
echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>del</font></a>";
echo "</td></tr></table>";
echo "<div class=collapsed id=".$i."all>";
$i=$this->find($this->items["l_node][$i]"]);//visite left child node
$this->count=$this->count+2;
$this->m_l_r_list($i);
exit;
}//if his left child node have not been visited

if($this->items["l_node][$i]"]==-1) {
echo "</div>";
$i=$this->find($this->items["f_node][$i]"]);
if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point
$this->items["r_node][$i]"]=-1;
}
if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point
$this->items["l_node][$i]"]=-1;
$this->count=$this->count-2;
}
$this->m_l_r_list($i);
exit;
}//if his left child node have been visite,up to his parent node


}
if(($this->items["f_node][$i]"]!=0)&&($this->items["r_node][$i]"]!=0)&&($this->items["l_node][$i]"]==0))
{//if node only have right child
$current_node=$this->items["d_id][$i]"];
$j=$this->find($this->items["f_node][$i]"]);
if($this->items["r_node][$i]"]!=-1) {
echo "<table><tr><td>";
for ($k=0;$k<$this->count;$k++) { echo " ";}
echo "<a href=\"main.php?d_id=".$this->items["d_id][$i]"]."\" target=\"rightframe\">".$this->items["node_value][$i]"]."</a>";
//echo $this->items["node_value][$i]"];
echo " <a href=addnode.php?id=".$this->items["d_id][$i]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo " <a href=delnode.php?id=".$this->items["d_id][$i]"]."><font size=2 color=red>del</font></a>";
echo "</td></tr></table>";
$i=$this->find($this->items["r_node][$i]"]);//visite right child node
$this->m_l_r_list($i);
exit;
}//if his right child node have not been visited

if($this->items["r_node][$i]"]==-1) {
$i=$this->find($this->items["f_node][$i]"]);
if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point
$this->items["r_node][$i]"]=-1;
}
if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point
$this->items["l_node][$i]"]=-1;
$this->count=$this->count-2;
}
$this->m_l_r_list($i);
exit;
}//if his right child node have been visite,up to his parent node


}
if(($this->items["f_node][$i]"]!=0)&&($this->items["l_node][$i]"]==0)&&($this->items["r_node][$i]"]==0))
{//if this node haven't child node,print it and up to his parent
 //node his parent left or right child have been visited
$current_node=$this->items["d_id][$i]"];
$j=$i;
$i=$this->find($this->items["f_node][$i]"]);//up to parent
//echo $this->items["l_node][$i]"];
if(($this->items["r_node][$i]"]==$current_node)) {//his parent use right point
echo "<table><tr><td>";
for ($k=0;$k<$this->count;$k++) { echo " ";}
echo "<a href=\"main.php?d_id=".$this->items["d_id][$j]"]."\" target=\"rightframe\">".$this->items["node_value][$j]"]."</a>";
//echo $this->items["node_value][$j]"];
echo " <a href=addnode.php?id=".$this->items["d_id][$j]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo " <a href=delnode.php?id=".$this->items["d_id][$j]"]."><font size=2 color=red>del</font></a>";
echo "</td></tr></table>";
echo "</div>";
$this->items["r_node][$i]"]=-1;

}
if(($this->items["l_node][$i]"]==$current_node)) {//his parent use left point

echo "<table><tr><td>";
for ($k=0;$k<$this->count;$k++) { echo " ";}
echo "<a href=\"main.php?d_id=".$this->items["d_id][$j]"]."\" target=\"rightframe\">".$this->items["node_value][$j]"]."</a>";
//echo $this->items["node_value][$j]"];
echo " <a href=addnode.php?id=".$this->items["d_id][$j]"]." target=\"rightframe\"><font size=2 color=red>add</font></a>";
echo " <a href=delnode.php?id=".$this->items["d_id][$j]"]."><font size=2 color=red>del</font></a>";
echo "</td></tr></table>";
echo "</div>";
$this->items["l_node][$i]"]=-1;
$this->count=$this->count-2;

}
$this->m_l_r_list($i);
exit;
}

}

function pages_0($d_id){//
include("conn_db.php");
$sql_query="select * from node_page where d_id=$d_id";
$query_db=mysql_query($sql_query,$connect);
$mypage=mysql_fetch_array($query_db);
include("conn_close.php");
if($mypage["d_page"]!='')
{
return $mypage["d_page"];
}
else return "init.php";
}
function pages($d_id){//
include("conn_db.php");
$sql_query="select * from node_page where d_id=$d_id";
$query_db=mysql_query($sql_query,$connect);
$mypage=mysql_fetch_array($query_db);
include("conn_close.php");
return $mypage["d_page"];
}

function showinfo_0($status){//
include("conn_db.php");
$sql_query="select * from department order by d_id";
$query_db=mysql_query($sql_query,$connect);
$info_all=mysql_num_rows($query_db);
$this->items["info_all"]=$info_all;
if($status==1) {//when status=1 show all data gets from database
$mnums=$info_all;
}
if($status==0) {//when status=0 show 6 messages gets from database
$mnums=6;
}
for($i=1;$i<=$mnums;$i++)
{
$messages=mysql_fetch_array($query_db);
$this->items["d_id][$i]"]=$messages["d_id"];
$this->items["f_node][$i]"]=$messages["f_node"];
$this->items["node_value][$i]"]=$messages["node_value"];
$this->items["l_node][$i]"]=$messages["l_node"];
$this->items["r_node][$i]"]=$messages["r_node"];
}
include("conn_close.php");
}
}

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:php.ini 配置详细选项
· 下一篇:写不下了
· 一个用PHP+MYSQL实现论坛里的分级+分页显示的例程
· “在phpMyAdmin使用用户口令登陆”补充
· 解决Apache日志文件ACCESS.LOG日益膨胀的一个办法
· 用PHP写的SMTP类,支持附件(多个),支持HTML
· 环境需求与准备工作


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077