zoukankan      html  css  js  c++  java
  • php 系统树形类,以树形方式显示,无限分级类

    <?php
    /**
    *系统树形类,以树形方式显示
    *
    *
    */
    header("Content-type: text/html; charset=utf-8;");
    class TreeModel{
        /**
        *树形标识
        */
        public $icon = array('│','├','└');
        public $nbsp = "&nbsp;&nbsp;&nbsp;";
        /**
        *树形的二维数组数据
        */
        public $arr = array();
        public $arrTree = array();
        public $ret;
        
        /**
        *初始化数组,传入的数组必须是
        * array(
        *      1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
        *      2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
        *      3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一')
        *)这种形式 数组下标与当前数据ID相同
        */
        public function init($arr = array()){
            if(!empty($arr) && is_array($arr)) {
                 $this->arr = $arr;
            }
            return $this->arr;
        }
        
        //-------------------------------------------------------------------
        
        /**
        *获得全部的树形数据
        *每个父类的子类在$arr[son]数据中
        *占用空间比较大
        */
        public function GetArrayTreeSpace()
        {
            $tmpArray    = array();  //临时数组
            $tmpSonArray = array();
            $tmp         = array();

                $tmpArray = $this->arr;

            $key = '';
            foreach($tmpArray as $key=>$tmp) {
                if($tmp['parentid']) {//如果存在父级ID
                    $tmpArray[$tmp['parentid']]['son'][] = &$tmpArray[$key];
                    $tmpSonArray[] = $key;
                }
            }
            foreach($tmpSonArray as $key) {
                unset($tmpArray[$key]);
            }
            unset($tmpSonArray);
            return $this->arrTree = $tmpArray;
        }
        /**
        *获得此类的同级父数组,
        *
        */
        public function GetParent($myid) {
            $tmp = array();
            $parentid = $this->arr[$myid]['parentid'];
            $parentid = $this->arr[$parentid]['parentid'];
            foreach($this->arr as $v) {
                if($parentid == $v['parentid']) {
                    $tmp[] = $v;
                }
            }
        }
        
        /**
        *获得此类的子类
        *
        */
        public function GetChild($myid) {
            $tmp = array();
            foreach($this->arr as $key=>$v) {
                if($v['parentid'] == $myid){
                    $tmp[$key] = $v;
                }
            }
            return $tmp;
        }
        /**
        *输出html格式的树形
        *@param 数据
        *@param 输出的格式
        */
        public function GetViewTreeSpace($arr,$str,$adds='') {
            $ret = '';
            $nbsp = $this->nbsp;
            $spacer = $adds ? $this->icon[1].$nbsp.$adds : '';
            foreach($arr as $tmp) {
                @extract($tmp); //转换数组下标为变量
                eval("$nstr = "$str";");
                $ret .= $nstr;
                if(isset($tmp['son'])) {
                    $ret .= $this->GetViewTreeSpace($tmp['son'],$str,$nbsp.$this->icon[2].$adds);
                }
            }
            return $ret;
        }
        /**
        *输出html格式的树形
        *@param 父级ID
        *@param 输出的格式
        */
        public function GetViewTree($myid,$str,$adds='') {
            $child  = $this->GetChild($myid);
            $nbsp = $this->nbsp;
            $spacer = $adds ? $this->icon[1].$nbsp.$adds : '';
            foreach($child as $key=>$tmp) {
                @extract($tmp); //转换数组下标为变量
                eval("$nstr = "$str";");
                $this->ret .= $nstr;
                $this->GetViewTree($key,$str,$nbsp.$this->icon[2].$adds);
            }
            return $this->ret;
        }

    }


        $array =  array(
              1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
              2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
              3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
              4 => array('id'=>'4','parentid'=>0,'name'=>'一级栏目一'),
              5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目二'),
              6 => array('id'=>'6','parentid'=>5,'name'=>'三级栏目一'),
              7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目一'),
              8 => array('id'=>'8','parentid'=>7,'name'=>'四级栏目二'),
              9 => array('id'=>'9','parentid'=>1,'name'=>'二级栏目一'),
              10 => array('id'=>'10','parentid'=>0,'name'=>'一级栏目一'),
              11 => array('id'=>'11','parentid'=>2,'name'=>'二级栏目二')
              );
            $Trees = new TreeModel();
            $Trees->init($array);
            //print_r($array);
            $str = '<li>$spacer $name [id] $id</li>';
            echo $Trees->GetViewTree(0, $str);
            echo '<br/><br/><br/><br/>';
            $arr = $Trees->GetArrayTreeSpace();
            
            echo $Trees->GetViewTreeSpace($arr,$str);

    两次结果输出如下:

    • 一级栏目一 [id] 1
    • ├      └ 二级栏目一 [id] 3
    • ├      └   └ 三级栏目一 [id] 7
    • ├      └   └   └ 四级栏目二 [id] 8
    • ├      └ 二级栏目一 [id] 9
    • 一级栏目二 [id] 2
    • ├      └ 二级栏目二 [id] 5
    • ├      └   └ 三级栏目一 [id] 6
    • ├      └ 二级栏目二 [id] 11
    • 一级栏目一 [id] 4
    • 一级栏目一 [id] 10





    • 一级栏目一 [id] 1
    • ├      └ 二级栏目一 [id] 3
    • ├      └   └ 三级栏目一 [id] 7
    • ├      └   └   └ 四级栏目二 [id] 8
    • ├      └ 二级栏目一 [id] 9
    • 一级栏目二 [id] 2
    • ├      └ 二级栏目二 [id] 5
    • ├      └   └ 三级栏目一 [id] 6
    • ├      └ 二级栏目二 [id] 11
    • 一级栏目一 [id] 4
    • 一级栏目一 [id] 10

    欢迎大家讨论更好的方法

  • 相关阅读:
    【博弈论】【SG函数】【找规律】Gym
    【kd-tree】CDOJ
    【线段树】Codeforces Round #393 (Div. 1) C. Nikita and stack
    【二分】【动态规划】Codeforces Round #393 (Div. 1) B. Travel Card
    【置换群】Codeforces Round #393 (Div. 1) A. Pavel and barbecue
    【指数型母函数】hdu1521 排列组合
    【Heap-dijkstra】Gym
    【最近公共祖先】【线段树】URAL
    【动态规划】Codeforces Round #392 (Div. 2) D. Ability To Convert
    【找规律】Codeforces Round #392 (Div. 2) C. Unfair Poll
  • 原文地址:https://www.cnblogs.com/phplhs/p/4146278.html
Copyright © 2011-2022 走看看