当前位置:Linux教程 - Php - 无限分类

无限分类

无限分类  
作者:a  来源:  



  一次输出所有的分类,可以使用点击隐藏或显示子分类
也可以一次显示所有或者显示下拉菜单列表(也是树状的)
至于分类添加删除转移(包括分类下的所有节点)如果大家认为这个还可以的话可以在贴,现看看下面的代码吧
输出结果
┝图片
│┕测试
│ ┕测试分类
│ ┕测试测试
┝测试测试测试
┕eta
每一个如果有子目录都可以点开
数据库,中间有很多为了其他操作添加的字段自己判断去除不去也不影响测试
phpmyadmin输出的数据库结构记录
CREATE TABLE `tree` (
`boardid` tinyint(4) unsigned NOT NULL auto_increment,
`boardname` varchar(20) NOT NULL default '',
`boardnick` varchar(20) NOT NULL default '',
`p_b_id` tinyint(4) unsigned NOT NULL default '0',
`bpath` varchar(200) NOT NULL default '|',
`boardtype` enum('dir','file') NOT NULL default 'file',
`put_stat` enum('put','get','none') NOT NULL default 'put',
`showmod` tinyint(3) NOT NULL default '0',
`showdate` varchar(100) NOT NULL default 'yy-mm-dd',
`showline` int(3) NOT NULL default '10',
`show_t_cnt` int(3) NOT NULL default '0',
`show_c_cnt` int(4) NOT NULL default '0',
UNIQUE KEY `boardid` (`boardid`,`boardname`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;

#
# 导出表中的数据 `web_board`
#

INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (1, '图片', 'PHOTO', 0, '|0|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);
INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (2, '测试分类', 'test', 3, '|0|1|3|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);
INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (3, '测试', 'tett', 1, '|0|1|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);
INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (4, '测试测试', 'twetrw', 2, '|0|1|3|2|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);
INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (5, '测试测试测试', 'raerawer', 0, '|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);
INSERT INTO `web_board` (`boardid`, `boardname`, `boardnick`, `p_b_id`, `bpath`, `boardtype`, `put_stat`, `showmod`, `showdate`, `showline`, `show_t_cnt`, `show_c_cnt`) VALUES (6, 'eta', 'awetrawer', 0, '|', 'file', 'put', 0, 'yy-mm-dd', 10, 0, 0);

以下是生成无限分类的类,里面有3个演示树状目录方法,大家可以自己定义树状目录样式,按这3个演示修改就可以了,其中一个用到了几张图片做的粗糙如果需要也可一传上来

//class 类

<?php
class Tree {
/*
*$tree_t $tree_c $tree_l $tree_k够成树状结构的图形
*/
var $tree_t="┝";//节点,下面还有同深度的节点
var $tree_c="┕";//节点,下面还没有同深度的节点
var $tree_l="│";//非节点,过渡,下面有父节点同深度的节点
var $tree_k=" ";//非节点,过渡,下面没有父节点同深度的节点

/*
$tree_f,$tree_a和$tree_m 可以使用[treeid] [ptreeid] [treename] [treenick] [allvalue]
四个字串代替相应的变量
*/
var $tree_m="[treename]";//主体
var $tree_f="<option value=[treeid]>";//前缀
var $tree_a="</option>";//后缀

/*$outstr 输出树状目录结构的字符串*/
var $outstr="<script>
function clickspan()
{
div=arguments[0];

if (div.style.display=='none'||!div.style.display)
{
div.style.display='block';
}
else if(div.style.display=='block')
{
div.style.display='none';
}
}
</script>"
;
/*设定显示*/
function setTree ($t,$c,$l,$k,$m,$f,$a){
if (!empty(
$t)) {
$this->tree_t=$t;
}
if (!empty(
$c)) {
$this->tree_c=$c;
}
if (!empty(
$l)) {
$this->tree_l=$l;
}
if (!empty(
$k)) {
$this->tree_k=$k;
}
if (!empty(
$f)) {
$this->tree_f=$f;
}
if (!empty(
$a)) {
$this->tree_a=$a;
}
if (!empty(
$m)) {
$this->tree_m=$m;
}
}
/*检索表生成数组*/
function _list_tree($table) {
$query="select * from $table order by p_b_id";
$result=mysql_query($query);
while (
$row=mysql_fetch_assoc($result)) {
$arr_tree[$row["p_b_id"]][$row["boardid"]]=$row["p_b_id"]."|".$row["boardid"]."|".$row["boardname"]."|".$row["boardnick"];
}
return (
$arr_tree);
}
/*
*_echo_o_tree($p_b_id,$arrboard,&$q_str,$i)
*生成树状目录结构
*$p_b_id 父目录id
*$arrboard _list_board()生成的数组

*$q_str数组 记录显示树状目录结构$tree_l和$tree_k的数组
*$i深度
*$kk同一层内的序号0开始
*使用递归生成树状结构 */

function _echo_o_tree($p_t_id,$arrtree,&$q_str,$i,$click=false) {
//改方法实现了点击隐藏或打开子分类的功能
if (is_array($arrtree[$p_t_id])) {
$len=count($arrtree[$p_t_id]);
$kk=0;
foreach(
$arrtree[$p_t_id] as $key=>$var) {
list(
$ptreeid,$treeid,$treename,$treenick)=explode("|",$var);//分割数组信息
$r_str=array("treeid"=>$treeid,"ptreeid"=>$ptreeid,"treename"=>$treename,"treenick"=>$treenick,"allvalue"=>$var);
/*
生成结构
*/

if ($kk<$len-1) {

$end_str=$this->_replace($this->tree_t,$r_str);
$q_str[$i]=$this->_replace($this->tree_l,$r_str);
} else {
$end_str=$this->_replace($this->tree_c,$r_str);
$q_str[$i]=$this->_replace($this->tree_k,$r_str);
}
if (
$p_t_id==0) {
//检索的是最顶层目录
$i=0;
}
$div="div".$treeid;
$this->outstr.=$this->_replace($this->tree_f,$r_str);
for (
$k=0;$k<$i;$k++) {
$this->outstr.=$q_str[$k];
}
$this->outstr.=$end_str;
if (
$click==true) $this->outstr.="<span onclick="java script:clickspan(document.all.${div})">";
$this->outstr.=$this->_replace($this->tree_m,$r_str);
$this->outstr.=$this->_replace($this->tree_a,$r_str);
if (
$click==true) $this->outstr.="</span>";
if (
$click==true) $this->outstr.="n<span id="$div" style="display:none">n";
$i++;
$this->_echo_o_tree($key,$arrtree,&$q_str,$i,$click);
if (
$click==true) $this->outstr.="</span>n";
$kk++;//移到下一个
$i--;//恢复$i
/*
生成结构完成
*/
}
} else {
/*检索到最底层返回*/
return;
}
}

/*置换定义的字串*/
function _replace($str,$r_str) {
foreach (
$r_str as $key=>$var) {
$str=str_replace("[$key]",$var,$str);
}
return(
$str);
}
/*echo_tree()显示树状目录*/
function echo_tree() {
echo
$this->outstr;
}
/*
*list_select_board()和list_board()是两个默认的树状目录结构
*/
function list_select_tree() {
$table="tree";
$arrboard=$this->_list_tree($table);
$this->outstr="<select name=p_b_id class=boardsele>";
$this->outstr.="<option value=0><--顶层板块--></option>";
$this->_echo_o_tree(0,$arrboard,$q_str,0,false);
$this->outstr.="</select>";
return (
$outstr);
}
function
list_tree() {
$table="tree";
$arrboard=$this->_list_tree($table);
$t="<img src=./images/tree_t.gif align=absmiddle width=20 height=20>";
$c="<img src=./images/tree_c.gif align=absmiddle width=20 height=20>";
$l="<img src=./images/tree_l.gif align=absmiddle width=20 height=20>";
$k="☆";//"<img src=./images/tree_k.gif align=absmiddle width=20 height=20>";
$m="<input type="radio" name="board" value="[allvalue]" width=20 height=20>[treename]([treenick])";
$f="【★】";
$a="<br>n";
$this->setTree ($t,$c,$l,$k,$m,$f,$a);
$this->_echo_o_tree(0,$arrboard,$q_str,0,false);
}
function
list_click_tree() {
$table="tree";
$arrboard=$this->_list_tree($table);
/*$t="<img src=./images/tree_t.gif align=absmiddle width=20 height=20>";
$c="<img src=./images/tree_c.gif align=absmiddle width=20 height=20>";
$l="<img src=./images/tree_l.gif align=absmiddle width=20 height=20>";
$k=" ";//"<img src=./images/tree_k.gif align=absmiddle width=20 height=20>";
$m="<input type="radio" name="board" value="[allvalue]" width=20 height=20>[treename]([treenick])";
$f="【★】";*/
$a="<br>n";
$this->setTree ($t,$c,$l,$k,$m,$f,$a);
$this->_echo_o_tree(0,$arrboard,$q_str,0,true);
}

}

?>
使用如下

$ctree=new Tree;
$ctree->list_click_tree();
$ctree->echo_tree();//列树状目录
//当然了你要自己打开数据库连接,这个要是也不会我就没办法了
以上是一个默认演示
自定义样式可以参见类内的list_click_tree(),list_tree(), list_select_tree()
大家要是觉得好的话我我在吧分类的添加删除移动上传上来