<?php
002 |
/** |
003 |
* 通用的树型类,可以生成任何树型结构 |
004 |
*/ |
005 |
class tree
|
006 |
{ |
007 |
/**
|
008 |
* 生成树型结构所需要的2维数组
|
009 |
* @var array
|
010 |
*/
|
011 |
var $arr = array();
|
012 |
013 |
/**
|
014 |
* 生成树型结构所需修饰符号,可以换成图片
|
015 |
* @var array
|
016 |
*/
|
017 |
var $icon = array('│','├','└');
|
018 |
019 |
/**
|
020 |
* @access private
|
021 |
*/
|
022 |
var $ret = '';
|
023 |
024 |
/**
|
025 |
* 构造函数,初始化类
|
026 |
* @param array 2维数组,例如:
|
027 |
* array(
|
028 |
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'),
|
029 |
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'),
|
030 |
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'),
|
031 |
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'),
|
032 |
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'),
|
033 |
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'),
|
034 |
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二')
|
035 |
* )
|
036 |
*/
|
037 |
function tree($arr=array())
|
038 |
{
|
039 |
$this->arr = $arr;
|
040 |
$this->ret = '';
|
041 |
return is_array($arr);
|
042 |
}
|
043 |
044 |
/**
|
045 |
* 得到父级数组
|
046 |
* @param int
|
047 |
* @return array
|
048 |
*/
|
049 |
function get_parent($myid)
|
050 |
{
|
051 |
$newarr = array();
|
052 |
if(!isset($this->arr[$myid])) return false;
|
053 |
$pid = $this->arr[$myid]['parentid'];
|
054 |
$pid = $this->arr[$pid]['parentid'];
|
055 |
if(is_array($this->arr))
|
056 |
{
|
057 |
foreach($this->arr as $id => $a)
|
058 |
{
|
059 |
if($a['parentid'] == $pid) $newarr[$id] = $a;
|
060 |
}
|
061 |
}
|
062 |
return $newarr;
|
063 |
}
|
064 |
065 |
/**
|
066 |
* 得到子级数组
|
067 |
* @param int
|
068 |
* @return array
|
069 |
*/
|
070 |
function get_child($myid)
|
071 |
{
|
072 |
$a = $newarr = array();
|
073 |
if(is_array($this->arr))
|
074 |
{
|
075 |
foreach($this->arr as $id => $a)
|
076 |
{
|
077 |
if($a['parentid'] == $myid) $newarr[$id] = $a;
|
078 |
}
|
079 |
}
|
080 |
return $newarr ? $newarr : false;
|
081 |
}
|
082 |
083 |
/**
|
084 |
* 得到当前位置数组
|
085 |
* @param int
|
086 |
* @return array
|
087 |
*/
|
088 |
function get_pos($myid,&$newarr)
|
089 |
{
|
090 |
$a = array();
|
091 |
if(!isset($this->arr[$myid])) return false;
|
092 |
$newarr[] = $this->arr[$myid];
|
093 |
$pid = $this->arr[$myid]['parentid'];
|
094 |
if(isset($this->arr[$pid]))
|
095 |
{
|
096 |
$this->get_pos($pid,$newarr);
|
097 |
}
|
098 |
if(is_array($newarr))
|
099 |
{
|
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.' ',$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.' ');
|
182 |
$number++;
|
183 |
}
|
184 |
}
|
185 |
return $this->ret;
|
186 |
}
|
187 |
188 |
function have($list,$item){
|
189 |
return(strpos(',,'.$list.',',','.$item.','));
|
190 |
}
|
191 |
} |
192 |
?> |
[图片] 12.jpg
[图片] 22.jpg
注意:其实可以添加一个新的path字段,存储父节点组合的的路径,就不用递归循环了。