PHP无限分类(树形类)
<?php
//模拟PHP无限分类查询结果
returnarray(
array(
"id"=>1,
"pid"=>0,
"name"=>"主页"
),
array(
"id"=>2,
"pid"=>0,
"name"=>"新闻"
),
array(
"id"=>3,
"pid"=>0,
"name"=>"媒体"
),
array(
"id"=>4,
"pid"=>0,
"name"=>"下载"
),
array(
"id"=>5,
"pid"=>0,
"name"=>"关于我们"
),
array(
"id"=>6,
"pid"=>2,
"name"=>"天朝新闻"
),
array(
"id"=>7,
"pid"=>2,
"name"=>"海外新闻"
),
array(
"id"=>8,
"pid"=>6,
"name"=>"州官新闻"
),
array(
"id"=>9,
"pid"=>3,
"name"=>"音乐"
),
array(
"id"=>10,
"pid"=>3,
"name"=>"电影"
),
array(
"id"=>11,
"pid"=>3,
"name"=>"小说"
),
array(
"id"=>12,
"pid"=>9,
"name"=>"铃声"
),
array(
"id"=>13,
"pid"=>9,
"name"=>"流行音乐"
),
array(
"id"=>14,
"pid"=>9,
"name"=>"古典音乐"
),
array(
"id"=>15,
"pid"=>12,
"name"=>"热门铃声"
),
array(
"id"=>16,
"pid"=>12,
"name"=>"搞笑铃声"
),
array(
"id"=>17,
"pid"=>12,
"name"=>"MP3铃声"
),
array(
"id"=>18,
"pid"=>17,
"name"=>"128K"
),
array(
"id"=>19,
"pid"=>8,
"name"=>"娱乐新闻"
),
array(
"id"=>20,
"pid"=>11,
"name"=>"穿越类"
),
array(
"id"=>21,
"pid"=>11,
"name"=>"武侠类"
),
);
?>
拉风归拉风,但是那些文章提供的无限分类的类相关操作有点挫,直接把对数据库操作也封装进去了。也就是别人要用你这个类,还要跟你建一样的表,真TM恶心。由于项目要用到,所以自己写了一个PHP无限分类的类(也称树形类),没有数据库的操作,只需要实例化的时候传进去结果集,也就是树形数组。再执行leaf方法或navi方法即可得到想要的结果,下面请看源码,看完之后奉上smarty模板引擎的相应的模板递归方法。
<?php
/**
*Tree树型类(无限分类)
*
*@authorKvoid
*@copyrighthttp://kvoid.com
*@version1.0
*@accesspublic
*@example
* $tree=newTree($result);
* $arr=$tree->leaf(0);
* $nav=$tree->navi(15);
*/
classTree{
private$result;
private$tmp;
private$arr;
private$already=array();
/**
*构造函数
*
*@paramarray$result树型数据表结果集
*@paramarray$fields树型数据表字段,array(分类id,父id)
*@paraminteger$root顶级分类的父id
*/
publicfunction__construct($result,$fields=array("id","pid"),$root=0){
$this->result=$result;
$this->fields=$fields;
$this->root=$root;
$this->handler();
}
/**
*树型数据表结果集处理
*/
privatefunctionhandler(){
foreach($this->resultas$node){
$tmp[$node[$this->fields[1]]][]=$node;
}
krsort($tmp);
for($i=count($tmp);$i>0;$i--){
foreach($tmpas$k=>$v){
if(!in_array($k,$this->already)){
if(!$this->tmp){
$this->tmp=array($k,$v);
$this->already[]=$k;
continue;
}else{
foreach($vas$key=>$value){
if($value[$this->fields[0]]==$this->tmp[0]){
$tmp[$k][$key]["child"]=$this->tmp[1];
$this->tmp=array($k,$tmp[$k]);
}
}
}
}
}
$this->tmp=null;
}
$this->tmp=$tmp;
}
/**
*反向递归
*/
privatefunctionrecur_n($arr,$id){
foreach($arras$v){
if($v[$this->fields[0]]==$id){
$this->arr[]=$v;
if($v[$this->fields[1]]!=$this->root)$this->recur_n($arr,$v[$this->fields[1]]);
}
}
}
/**
*正向递归
*/
privatefunctionrecur_p($arr){
foreach($arras$v){
$this->arr[]=$v[$this->fields[0]];
if($v["child"])$this->recur_p($v["child"]);
}
}
/**
*菜单多维数组
*
*@paraminteger$id分类id
*@returnarray返回分支,默认返回整个树
*/
publicfunctionleaf($id=null){
$id=($id==null)?$this->root:$id;
return$this->tmp[$id];
}
/**
*导航一维数组
*
*@paraminteger$id分类id
*@returnarray返回单线分类直到顶级分类
*/
publicfunctionnavi($id){
$this->arr=null;
$this->recur_n($this->result,$id);
krsort($this->arr);
return$this->arr;
}
/**
*散落一维数组
*
*@paraminteger$id分类id
*@returnarray返回leaf下所有分类id
*/
publicfunctionleafid($id){
$this->arr=null;
$this->arr[]=$id;
$this->recur_p($this->leaf($id));
return$this->arr;
}
}
?>
在smarty中的PHP无限分类的使用方法:
在smarty模板中这样递归: 转载请申明来自kvoid.com 当然,你也可以更改递归方法,用你想的标签不受拘束。HTML+PHP混编的递归方法这里就不贴了,我也懒得写,最讨厌混编,看着恶心,在这里推荐一下jake前辈的SpeedPHP框架,由于默认的引擎是smarty,我的这个PHP无限分类完全兼容SP框架。同样的,jquery的treeview插件和下拉菜单插件也完美支持。 对了,建议使用Smarty强大的缓存功能,缓存才是王道。
$result=$db->query(……);//这里查询得到结果集,注意结果集为数组
$tree=newTree($result);
$arr=$tree->leaf(0);
$nav=$tree->navi(15);
$smarty->assign(‘arr",$arr);
$smarty->assign(‘nav",$nav);
$smarty->display(‘test.html");
<!--导航-->
<divid="navigator">
<{foreach$navas$n}>
<{if$n@iteration!=$n@last}>
<{$n.name}>->
<{else}>
<{$n.name}>
<{/if}>
<{/foreach}>
</div>
<!--树形菜单-->
<divid="menu">
<{functionname=menu}>
<ul>
<{foreach$dataas$entry}>
<li>
<span><{$entry.name}></span><{*注意字段要改成自己的字段哦*}>
<{ifisset($entry.child)}>
<{callname=menudata=$entry.child}>
<{/if}>
</li>
<{/foreach}>
</ul>
<{/function}>
<{callname=menudata=$arr}><{*注意在这里$arr才是模板变量*}>
</div>
相关文章