当前位置:首页 > 综合实例 > 列表

分享一个php实现无限级分类程序代码

发布:smiling 来源: PHP粉丝网  添加日期:2014-01-16 13:44:25 浏览: 评论:0 

无限级分类是所有程序开发中会碰到的一个问题,下面我来介绍php+mysql实现的一个无限级分类程序,有需要的朋友可参考参考,下面给大家看看我的数据库结构吧,数据库的名字为 fa_category

Field Type Comment

cid int(11) 分类id

catename varchar(255) 分类名字

catetype int(1) 分类类型,1为单页面,2为普通分类

catdir varchar(255) 英文目录

display int(1) 1为显示,2为不显示

keywords varchar(255) 栏目关键字

description text 栏目描述

ctime int(11) 创建时间

parentid int(11) 父节点id,最高节点父节点为0

我们使用一个parentid字段来记录父节点的id,如果parentid为0,则为root,不多说,我们看看代码怎么写吧,我们要实现的功能就是如图片所示:

怎么样把它这样显示呢?这个问题我想了很久,先看看这段SQL语句吧,代码如下:

  1. SELECT c.cat_id, c.cat_name, c.measure_unit, c.parent_id, c.is_show, c.show_in_nav, c.grade         ,c.sort_order, COUNT( s.cat_id ) AS has_children 
  2. FROM ecs_category AS c 
  3. LEFT JOIN ecs_category AS s ON s.parent_id = c.cat_id 
  4. GROUP BY c.cat_id 
  5. ORDER BY c.parent_id, c.sort_order ASC 

用左连接连接一个表,返回一个字段 has_children,这个字段是记录有多少子节点,看看代码吧:

  1. public function getCategory($catid=0,$re_type = true,$selected=0) 
  2.     { 
  3.         $db      =  new Public_DataBase(); 
  4.         $sql  =  'select c.cid,c.catename,c.catetype,c.ctime,c.parentid,count(s.cid) as has_children from '
  5.         __MYSQL_PRE.'category as c left join '
  6.         __MYSQL_PRE.'category as s on s.parentid=c.cid group by c.cid order by c.parentid asc'
  7.         $res          =  $db->selectTable($sql); 
  8.         $cateInfo     =    self::getChildTree($catid,$res); 
  9.         if($re_type==true) 
  10.         { 
  11.                $select   =    ''
  12.               foreach($cateInfo as $val
  13.               { 
  14.                  $select .= '<option value="' . $val['cid'] . '" '
  15.                  $select .= ($selected == $val['cid']) ? "selected='ture'" : ''
  16.                  $select .= '>'
  17.                   if($val['level']>0) 
  18.                   {           
  19.                    $select .= str_repeat('&nbsp;'$val['level'] * 4); 
  20.                   } 
  21.                   $select .= htmlspecialchars(addslashes($val['catename']), ENT_QUOTES) . '</option>'
  22.               } 
  23.               return $select
  24.         } 
  25.          
  26.         else 
  27.         { 
  28.             foreach($cateInfo as $key=>$val
  29.             { 
  30.                   if($val['level']>0) 
  31.                   {           
  32.                            $cateInfo[$key]['catename']    =    "|".str_repeat('&nbsp;'$val['level'] * 8)."└─".$val['catename']; 
  33.                            
  34.                   } 
  35.             } 
  36.             return $cateInfo
  37.         } 
  38.          
  39.          
  40.     } 
  41.      
  42.     /** 
  43.      * 通过父ID递归得到所有子节点树 
  44.      * @param int $catid  上级分类 
  45.      * @param array $arr  含有所有分类的数组 
  46.      * @return array 
  47.      */ 
  48.     public function getChildTree($catid,$arr
  49.     { 
  50.         $level = $last_cat_id = 0; 
  51.         while (!emptyempty($arr)) 
  52.         { 
  53.             foreach($arr as $key=>$value
  54.             { 
  55.                 $cid     =  $value['cid']; 
  56.                 if ($level == 0 && $last_cat_id == 0) 
  57.                 { 
  58.                    if ($value['parentid'] > 0) 
  59.                    { 
  60.                        break
  61.                    } 
  62.                    $options[$cid]          =     $value
  63.                    $options[$cid]['level'] =     $level
  64.                    $options[$cid]['id']    =     $cid
  65.                    $options[$cid]['name']  =     $value['catename']; 
  66.                    unset($arr[$key]); 
  67.                    if ($value['has_children'] == 0) 
  68.                    { 
  69.                         continue
  70.                    } 
  71.                    $last_cat_id  = $cid
  72.                    $cat_id_array = array($cid); 
  73.                    $level_array[$last_cat_id] = ++$level
  74.                    continue
  75.       
  76.                 } 
  77.                 if ($value['parentid'] == $last_cat_id
  78.                 { 
  79.                         $options[$cid]          = $value
  80.                         $options[$cid]['level'] = $level
  81.                         $options[$cid]['id']    = $cid
  82.                         $options[$cid]['name']  = $value['catename']; 
  83.                         unset($arr[$key]); 
  84.                         if ($value['has_children'] > 0) 
  85.                         { 
  86.                             if (end($cat_id_array) != $last_cat_id
  87.                             { 
  88.                                 $cat_id_array[] = $last_cat_id
  89.                             } 
  90.                                 $last_cat_id    = $cid
  91.                                 $cat_id_array[] = $cid
  92.                                 $level_array[$last_cat_id] = ++$level
  93.                         } 
  94.                 } 
  95.                 elseif ($value['parentid'] > $last_cat_id
  96.                 { 
  97.                     break
  98.                 } 
  99.             } 
  100.              
  101.              $count = count($cat_id_array); 
  102.              if ($count > 1) 
  103.              { 
  104.                  $last_cat_id = array_pop($cat_id_array); 
  105.                   
  106.              } 
  107.              elseif ($count == 1) 
  108.              { 
  109.                if ($last_cat_id != end($cat_id_array)) 
  110.                { 
  111.                    $last_cat_id = end($cat_id_array); 
  112.                } 
  113.                else 
  114.                { 
  115.                     $level = 0; 
  116.                     $last_cat_id = 0; 
  117.                     $cat_id_array = array(); 
  118.                     continue
  119.                } 
  120.              } 
  121.              if ($last_cat_id && isset($level_array[$last_cat_id])) 
  122.              { 
  123.                 $level = $level_array[$last_cat_id]; 
  124.              } 
  125.              else 
  126.              { 
  127.                  $level = 0; 
  128.              } 
  129.         } 
  130.                     return $options
  131.     } 

用smarty的一个循环就可以把它显示出来,效果和上面图片的一样!大家有什么问题可以给我留言。

Tags: 无限级 分类程序

分享到:

相关文章