Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315453
  • 博文数量: 128
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1611
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-19 11:49
文章分类

全部博文(128)

文章存档

2018年(2)

2016年(2)

2014年(10)

2013年(114)

我的朋友

分类: PHP

2013-09-29 15:16:51

PHP无限分类,Google一下就能找到很多相关资料,思路比较拉风的,也是用得比较多的就是分类表至少有id,pid,name三个字段,id自增表分类,pid为父分类,name为分类名,这样就构成了一棵树,如下,算是我查询分类表得到的结果集


点击(此处)折叠或打开

  1. <?php
  2. //模拟PHP无限分类查询结果
  3. return array(
  4.     array(
  5.         'id'=>1,
  6.         'pid'=>0,
  7.         'name'=>'主页'
  8.     ),
  9.     array(
  10.         'id'=>2,
  11.         'pid'=>0,
  12.         'name'=>'新闻'
  13.     ),
  14.     array(
  15.         'id'=>3,
  16.         'pid'=>0,
  17.         'name'=>'媒体'
  18.     ),
  19.     array(
  20.         'id'=>4,
  21.         'pid'=>0,
  22.         'name'=>'下载'
  23.     ),
  24.     array(
  25.         'id'=>5,
  26.         'pid'=>0,
  27.         'name'=>'关于我们'
  28.     ),
  29.     array(
  30.         'id'=>6,
  31.         'pid'=>2,
  32.         'name'=>'天朝新闻'
  33.     ),
  34.     array(
  35.         'id'=>7,
  36.         'pid'=>2,
  37.         'name'=>'海外新闻'
  38.     ),
  39.     array(
  40.         'id'=>8,
  41.         'pid'=>6,
  42.         'name'=>'州官新闻'
  43.     ),
  44.     array(
  45.         'id'=>9,
  46.         'pid'=>3,
  47.         'name'=>'音乐'
  48.     ),
  49.     array(
  50.         'id'=>10,
  51.         'pid'=>3,
  52.         'name'=>'电影'
  53.     ),
  54.     array(
  55.         'id'=>11,
  56.         'pid'=>3,
  57.         'name'=>'小说'
  58.     ),
  59.     array(
  60.         'id'=>12,
  61.         'pid'=>9,
  62.         'name'=>'铃声'
  63.     ),
  64.     array(
  65.         'id'=>13,
  66.         'pid'=>9,
  67.         'name'=>'流行音乐'
  68.     ),
  69.     array(
  70.         'id'=>14,
  71.         'pid'=>9,
  72.         'name'=>'古典音乐'
  73.     ),
  74.     array(
  75.         'id'=>15,
  76.         'pid'=>12,
  77.         'name'=>'热门铃声'
  78.     ),
  79.     array(
  80.         'id'=>16,
  81.         'pid'=>12,
  82.         'name'=>'搞笑铃声'
  83.     ),
  84.     array(
  85.         'id'=>17,
  86.         'pid'=>12,
  87.         'name'=>'MP3铃声'
  88.     ),
  89.     array(
  90.         'id'=>18,
  91.         'pid'=>17,
  92.         'name'=>'128K'
  93.     ),
  94.     array(
  95.         'id'=>19,
  96.         'pid'=>8,
  97.         'name'=>'娱乐新闻'
  98.     ),
  99.     array(
  100.         'id'=>20,
  101.         'pid'=>11,
  102.         'name'=>'穿越类'
  103.     ),
  104.     array(
  105.         'id'=>21,
  106.         'pid'=>11,
  107.         'name'=>'武侠类'
  108.     ),
  109. );
  110. ?>

  拉风归拉风,但是那些文章提供的无限分类的类相关操作有点挫,直接把对数据库操作也封装进去了。也就是别人要用你这个类,还要跟你建一样的表,真TM恶 心。由于项目要用到,所以自己写了一个PHP无限分类的类(也称树形类),没有数据库的操作,只需要实例化的时候传进去结果集,也就是树形数组。再执行 leaf方法或navi方法即可得到想要的结果,下面请看源码,看完之后奉上smarty模板引擎的相应的模板递归方法。

点击(此处)折叠或打开

  1. <?php
  2. /**
  3.  * Tree 树型类(无限分类)
  4.  *
  5.  * @author Kvoid
  6.  * @copyright http://kvoid.com
  7.  * @version 1.0
  8.  * @access public
  9.  * @example
  10.  * $tree= new Tree($result);
  11.  * $arr=$tree->leaf(0);
  12.  * $nav=$tree->navi(15);
  13.  */
  14. class Tree {
  15.     private $result;
  16.     private $tmp;
  17.     private $arr;
  18.     private $already = array();
  19.     /**
  20.      * 构造函数
  21.      *
  22.      * @param array $result 树型数据表结果集
  23.      * @param array $fields 树型数据表字段,array(分类id,父id)
  24.      * @param integer $root 顶级分类的父id
  25.      */
  26.     public function __construct($result, $fields = array('id', 'pid'), $root = 0) {
  27.         $this->result = $result;
  28.         $this->fields = $fields;
  29.         $this->root = $root;
  30.         $this->handler();
  31.     }
  32.     /**
  33.      * 树型数据表结果集处理
  34.      */
  35.     private function handler() {
  36.         foreach ($this->result as $node) {
  37.             $tmp[$node[$this->fields[1]]][] = $node;
  38.         }
  39.         krsort($tmp);
  40.         for ($i = count($tmp); $i > 0; $i--) {
  41.             foreach ($tmp as $k => $v) {
  42.                 if (!in_array($k, $this->already)) {
  43.                     if (!$this->tmp) {
  44.                         $this->tmp = array($k, $v);
  45.                         $this->already[] = $k;
  46.                         continue;
  47.                     } else {
  48.                         foreach ($v as $key => $value) {
  49.                             if ($value[$this->fields[0]] == $this->tmp[0]) {
  50.                                 $tmp[$k][$key]['child'] = $this->tmp[1];
  51.                                 $this->tmp = array($k, $tmp[$k]);
  52.                             }
  53.                         }
  54.                     }
  55.                 }
  56.             }
  57.             $this->tmp = null;
  58.         }
  59.         $this->tmp = $tmp;
  60.     }
  61.     /**
  62.      * 反向递归
  63.      */
  64.     private function recur_n($arr, $id) {
  65.         foreach ($arr as $v) {
  66.             if ($v[$this->fields[0]] == $id) {
  67.                 $this->arr[] = $v;
  68.                 if ($v[$this->fields[1]] != $this->root) $this->recur_n($arr, $v[$this->fields[1]]);
  69.             }
  70.         }
  71.     }
  72.     /**
  73.      * 正向递归
  74.      */
  75.     private function recur_p($arr) {
  76.         foreach ($arr as $v) {
  77.             $this->arr[] = $v[$this->fields[0]];
  78.             if ($v['child']) $this->recur_p($v['child']);
  79.         }
  80.     }
  81.     /**
  82.      * 菜单 多维数组
  83.      *
  84.      * @param integer $id 分类id
  85.      * @return array 返回分支,默认返回整个树
  86.      */
  87.     public function leaf($id = null) {
  88.         $id = ($id == null) ? $this->root : $id;
  89.         return $this->tmp[$id];
  90.     }
  91.     /**
  92.      * 导航 一维数组
  93.      *
  94.      * @param integer $id 分类id
  95.      * @return array 返回单线分类直到顶级分类
  96.      */
  97.     public function navi($id) {
  98.         $this->arr = null;
  99.         $this->recur_n($this->result, $id);
  100.         krsort($this->arr);
  101.         return $this->arr;
  102.     }
  103.     /**
  104.      * 散落 一维数组
  105.      *
  106.      * @param integer $id 分类id
  107.      * @return array 返回leaf下所有分类id
  108.      */
  109.     public function leafid($id) {
  110.         $this->arr = null;
  111.         $this->arr[] = $id;
  112.         $this->recur_p($this->leaf($id));
  113.         return $this->arr;
  114.     }
  115. }
  116. ?>

在smarty中的PHP无限分类的使用方法

点击(此处)折叠或打开

  1. $result=$db->query(……);//这里查询得到结果集,注意结果集为数组
  2. $tree= new Tree($result);
  3. $arr=$tree->leaf(0);
  4. $nav=$tree->navi(15);
  5. $smarty->assign(‘arr',$arr);
  6. $smarty->assign(‘nav',$nav);
  7. $smarty->display(‘test.html

在smarty模板中这样递归:

点击(此处)折叠或打开

  1. <!--导航-->
  2. <div id="navigator">
  3. <{foreach $nav as $n}>
  4.     <{if $n@iteration != $n@last}>
  5.         <{$n.name}> ->
  6.     <{else}>
  7.         <{$n.name}>
  8.     <{/if}>
  9. <{/foreach}>
  10. </div>
  11. <!--树形菜单-->
  12. <div id="menu">
  13. <{function name=menu}>
  14.     <ul>
  15.         <{foreach $data as $entry}>
  16.             <li>
  17.                 <span><{$entry.name}></span> <{*注意字段要改成自己的字段哦*}>
  18.             <{if isset($entry.child)}>
  19.                 <{call name=menu data=$entry.child}>
  20.             <{/if}>
  21.             </li>
  22.         <{/foreach}>
  23.     </ul>
  24. <{/function}>
  25. <{call name=menu data=$arr}> <{*注意在这里$arr才是模板变量*}>
  26. </div>

阅读(1382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~