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

 

欢迎大家讨论更好的方法

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。