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