zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP无限分类(树形类)

PHP 分类 无限 树形
2023-06-13 09:15:05 时间

复制代码代码如下:


<?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无限分类的使用方法:

复制代码代码如下:
$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");

在smarty模板中这样递归:

复制代码代码如下:
<!--导航-->
<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>

转载请申明来自kvoid.com

当然,你也可以更改递归方法,用你想的标签不受拘束。HTML+PHP混编的递归方法这里就不贴了,我也懒得写,最讨厌混编,看着恶心,在这里推荐一下jake前辈的SpeedPHP框架,由于默认的引擎是smarty,我的这个PHP无限分类完全兼容SP框架。同样的,jquery的treeview插件和下拉菜单插件也完美支持。

对了,建议使用Smarty强大的缓存功能,缓存才是王道。