[PHP] php无限分类, 通用树型类,可以生成任何树型结构 →→→→→进入此内容的聊天室

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

回复 "php无限分类, 通用树型类,可以生成任何树型结构"

这儿你可以回复上面这条便签

captcha