当前位置:首页 > PHP教程 > php应用 > 列表

php 无限级分类,超级简单的无限级分类,支持输出树状图

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-03 15:19:27 浏览: 评论:0 

php 无限级分类,超级简单的无限级分类,支持输出树状图,代码来自网络, 只是自己用了挺长时间特地拿出来分享给大家。

无平台限制

只需要告知id,parentid,name 即可

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

Tags: php无限级分类

分享到: