【PHP】一个树形Tree类实现无限递归

林氏智造 于 2013-12-05 发布 7676 人已阅

 【类的功能】
用于创建无限极分类。

【原理】

通过递归数据创造无限树。


【代码】


    <?php
    /**
      * 树型类    
      */
    class Tree
    {
        /**
          * 生成树型结构所需要的2维数组
          *   @var array
          */
        public $arr = array();

        /**
          * 生成树型结构所需修饰符号,可以换成图片
          */
        public $icon = array('│','├','└');
        public $nbsp = "&nbsp;";
        public $ret = '';

        public function init($arr=array())
        {
           $this->arr = $arr;
           $this->ret = '';
           return is_array($arr);
        }

        /**
          * 得到子级数组
          * @param int
          * @return array
          */
        public function getChild($myid){
            $a = $newArr = array();
            if(is_array($this->arr)){
                foreach($this->arr as $id => $a){
                    if($a['parent_id'] == $myid) $newArr[$id] = $a;
                }
            }
            return $newArr ? $newArr : false;
        }

        /**
          * 递归获取所有子数据
          * @param int
          * @return string
          */
        public function getChildString($myid){
            $child = $this->getChild($myid);
            if(is_array($child))
            {
                foreach($child as $id=>$a)
                {        
                    @extract($a);
                    $this->ret .= $id.',';
                    $this->getChildString($id);
                }
            }
            return $this->ret;
        }

        /**
          * 得到当前位置数组
          * @param int
          * @return array
          */
        public function getPos($myid,&$newArr){
            $a=array();
            if(!isset($this->arr[$myid])) return false;
            $newArr[] = $this->arr[$myid];
            $pid = $this->arr[$myid]['parent_id'];
            if(isset($this->arr[$pid])){
                $this->getPos($pid,$newArr);
            }
            if(is_array($newArr)){
                krsort($newArr);
                foreach($newArr as $v){
                    $a[$v['id']] = $v;
                }
            }
            return $a;
        }

        /**
          * 得到树型结构
          * @param int ID,表示获得这个ID下的所有子级
          * @param string 生成树型结构的基本代码,例如:"<option value=$id $selected>$spacer$name</option>"
          * @param int 被选中的ID,比如在做树型下拉框的时候需要用到
          * @return string
          */
        public function getTree($myid, $str, $sid = 0, $adds = ''){
            $number=1;
            $child = $this->getChild($myid);
            if(is_array($child)){
                $total = count($child);
                foreach($child as $id=>$a){
                    $j=$k='';
                    if($number==$total){
                        $j .= $this->icon[2];
                    }else{
                        $j .= $this->icon[1];
                        $k = $adds ? $this->icon[0] : '';
                    }
                    $spacer = $adds ? $adds.$j : '';        
                    @extract($a);
                    if($sid!=0)
                    {
                        $selected = $id==$sid ?"selected='selected'" : '';    
                    }else{$selected='';}
                    eval("$nstr = "$str";");
                    $this->ret .= $nstr;
                    $nbsp = $this->nbsp;
                    $this->getTree($id, $str, $sid, $adds.$k.$nbsp);
                    $number++;
                }
            }
            return $this->ret;
        }

        /**
          * 得到树型结构options
          * @param int ID,表示获得这个ID下的所有子级
          * @param string 生成树型结构的基本代码,例如:"<option value=$id $selected>$spacer$name</option>"
          * @param string 生成树型结构的基本代码,例如:" <optgroup label="$spacer$name"></optgroup>"
          * @param int 被选中的ID,比如在做树型下拉框的时候需要用到
          * @return string
          */
        public function getTreeOptions($myid,$str,$str2,$sid = 0,$adds = ''){
            $number=1;
            $child = $this->getChild($myid);
            if(is_array($child)){
                $total = count($child);
                foreach($child as $id=>$a){
                    $j=$k='';
                    if($number==$total){
                        $j .= $this->icon[2];
                    }else{
                        $j .= $this->icon[1];
                        $k = $adds ? $this->icon[0] : '';
                    }
                    $spacer = $adds ? $adds.$j : '';        
                    @extract($a);
                    if($sid!=0)$selected = $id==$sid ? 'selected' : '';
                    if($is_list==1)
                    {
                      eval("$nstr = "$str";");
                    }else
                        {
                          eval("$nstr = "$str2";");
                        }
                    $this->ret .= $nstr;
                    $nbsp = $this->nbsp;
                    $this->getTreeOptions($id, $str,$str2,$sid, $adds.$k.$nbsp);
                    $number++;
                }
            }
            return $this->ret;
        }

    }

    ?>
【写在最后】
此类是我从PHPCMS中找到,版权归PHPCMS所有。

您可能感兴趣的文章

微信支付开发经验总结

微信的文档基本都是看得头大,经过一次微信支付项目的折腾总结了开发微信支付的思路并记录了开发过程中遇到的问题

根据不同的访问终端跳转相应URL

当网站存在pc版和手机版的时候,我们最想就是通过在不同终端输入域名就可以访问最合适版本的页面,这时候就需要程序判断终端类型来解决。

【PHP】一个中文转拼音类

在百度上收集了一个把中文转换成拼音的类,用了段时间感觉不错,在URL上出现中文拼音不知道有利于SEO这点百度上有些文章提到过,用此类就可以解决中文转拼音罗。