<?php
/**
*系统树形类,以树形方式显示
*
*
*/
header("Content-type: text/html; charset=utf-8;");
class TreeModel{
/**
*树形标识
*/
public $icon = array(‘│‘,‘├‘,‘└‘);
public $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
欢迎大家讨论更好的方法