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

Tags: php无限级分类

分享到: