程序员人生 网站导航

php无限分类可支持输出树状图实现代码

栏目:php教程时间:2013-12-04 12:12:41

这是一段可支持输出树状图的php无限分类实现代码,转自其它网站有需要了解的朋友可参考一下哦,数据库结构我们只要id,parentid,name这三个字段就可以了,大家可自行创建。

数据库结构我们只要,无平台限制,只需要告知id,parentid,name 即可,下面是php代码,需要php环境支持,代码如下:

  1. <?php 
  2. /** 
  3. * 通用的树型类,可以生成任何树型结构 
  4. */ 
  5. class tree 
  6.  /** 
  7.  * 生成树型结构所需要的2维数组 
  8.  * @var array 
  9.  */ 
  10.  var $arr = array(); 
  11.  /** 
  12.  * 生成树型结构所需修饰符号,可以换成图片 
  13.  * @var array 
  14.  */ 
  15.  var $icon = array('│','├','└'); 
  16.  /** 
  17.  * @access private 
  18.  */ 
  19.  var $ret = ''
  20.  /** 
  21.  * 构造函数,初始化类 
  22.  * @param array 2维数组,例如: 
  23.  * array( 
  24.  *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 
  25.  *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 
  26.  *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 
  27.  *      4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 
  28.  *      5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 
  29.  *      6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 
  30.  *      7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二') 
  31.  *      ) 
  32.  */ 
  33.  function tree($arr=array()) 
  34.  { 
  35.        $this->arr = $arr
  36.     $this->ret = ''
  37.     return is_array($arr); 
  38.  } 
  39.     /** 
  40.  * 得到父级数组 
  41.  * @param int 
  42.  * @return array 
  43.  */ 
  44.  function get_parent($myid
  45.  { 
  46.   $newarr = array(); 
  47.   if(!isset($this->arr[$myid])) return false; 
  48.   $pid = $this->arr[$myid]['parentid']; 
  49.   $pid = $this->arr[$pid]['parentid']; 
  50.   if(is_array($this->arr)) 
  51.   { 
  52.    foreach($this->arr as $id => $a
  53.    { 
  54.     if($a['parentid'] == $pid$newarr[$id] = $a
  55.    } 
  56.   } 
  57.   return $newarr
  58.  } 
  59.     /** 
  60.  * 得到子级数组 
  61.  * @param int 
  62.  * @return array 
  63.  */ 
  64.  function get_child($myid
  65.  { 
  66.   $a = $newarr = array(); 
  67.   if(is_array($this->arr)) 
  68.   { 
  69.    foreach($this->arr as $id => $a
  70.    { 
  71.     if($a['parentid'] == $myid$newarr[$id] = $a
  72.    } 
  73.   } 
  74.   return $newarr ? $newarr : false; 
  75.  } 
  76.     /** 
  77.  * 得到当前位置数组 
  78.  * @param int 
  79.  * @return array 
  80.  */ 
  81.  function get_pos($myid,&$newarr
  82.  { 
  83.   $a = array(); 
  84.   if(!isset($this->arr[$myid])) return false; 
  85.         $newarr[] = $this->arr[$myid]; 
  86.   $pid = $this->arr[$myid]['parentid']; 
  87.   if(isset($this->arr[$pid])) 
  88.   { 
  89.       $this->get_pos($pid,$newarr); 
  90.   } 
  91.   if(is_array($newarr)) 
  92.   { 
  93.    krsort($newarr); 
  94.    foreach($newarr as $v
  95.    { 
  96.     $a[$v['id']] = $v
  97.    } 
  98.   } 
  99.   return $a
  100.  } 
  101.  
  102.  /** 
  103.   * ------------------------------------- 
  104.   *  得到树型结构 
  105.   * ------------------------------------- 
  106.   * @author  Midnight(杨云洲),  yangyunzhou@foxmail.com 
  107.   * @param $myid 表示获得这个ID下的所有子级 
  108.   * @param $str 生成树形结构基本代码, 例如: "<option value=$id $select>$spacer$name</option>" 
  109.   * @param $sid 被选中的ID, 比如在做树形下拉框的时候需要用到 
  110.   * @param $adds 
  111.   * @param $str_group 
  112.   * @return unknown_type 
  113.   */ 
  114.  function get_tree($myid$str$sid = 0, $adds = ''$str_group = ''
  115.  { 
  116.   $number=1; 
  117.   $child = $this->get_child($myid); 
  118.   if(is_array($child)) 
  119.   { 
  120.       $total = sqlserver/42852.htm target=_blank >count($child); 
  121.    foreach($child as $id=>$a
  122.    { 
  123.     $j=$k=''
  124.     if($number==$total
  125.     { 
  126.      $j .= $this->icon[2]; 
  127.     } 
  128.     else 
  129.     { 
  130.      $j .= $this->icon[1]; 
  131.      $k = $adds ? $this->icon[0] : ''
  132.     } 
  133.     $spacer = $adds ? $adds.$j : ''
  134.     $selected = $id==$sid ? 'selected' : ''
  135.     @extract($a); 
  136.     $parentid == 0 && $str_group ? eval("$nstr = "$str_group";") : eval("$nstr = "$str";"); 
  137.     $this->ret .= $nstr
  138.     $this->get_tree($id$str$sid$adds.$k.'&nbsp;',$str_group); 
  139.     $number++; 
  140.    } 
  141.   } 
  142.   return $this->ret; 
  143.  } 
  144.     /** 
  145.  * 同上一方法类似,但允许多选 
  146.  */ 
  147.  function get_tree_multi($myid$str$sid = 0, $adds = ''
  148.  { 
  149.   $number=1; 
  150.   $child = $this->get_child($myid); 
  151.   if(is_array($child)) 
  152.   { 
  153.       $total = count($child); 
  154.    foreach($child as $id=>$a
  155.    { 
  156.     $j=$k=''
  157.     if($number==$total
  158.     { 
  159.      $j .= $this->icon[2]; 
  160.     } 
  161.     else 
  162.     { 
  163.      $j .= $this->icon[1]; 
  164.      $k = $adds ? $this->icon[0] : ''
  165.     } 
  166.     $spacer = $adds ? $adds.$j : ''
  167.     $selected = $this->have($sid,$id) ? 'selected' : ''
  168.     //echo $sid.'=>'.$id.' : '.$selected.' . <br/>'; 
  169.     @extract($a); 
  170.     eval("$nstr = "$str";"); 
  171.     $this->ret .= $nstr
  172.     $this->get_tree_multi($id$str$sid$adds.$k.'&nbsp;'); 
  173.     $number++; 
  174.    } 
  175.   } 
  176.   return $this->ret; 
  177.  } 
  178.  function have($list,$item){ 
  179.   return(strpos(',,'.$list.',',','.$item.',')); 
  180.  } 
  181. ?> 

效果就是

aa
  bbb
  ccc 这样哦,可实现无限级分类.
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐