通用树形下拉菜单生成类
[php]
<?php
/**
* 通用的树型类,可以生成任何树型结构
*/
class tree
{
/**
* 生成树型结构所需要的2维数组
* @var array
*/
var $arr = array();
/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
var $icon = array(‘│’,’├’,’└’);
/**
* @access private
*/
var $ret = ”;
/**
* 构造函数,初始化类
* @param array 2维数组,例如:
* 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’=>1,’name’=>’二级栏目二’),
* 5 => array(‘id’=>’5′,’parentid’=>2,’name’=>’二级栏目三’),
* 6 => array(‘id’=>’6′,’parentid’=>3,’name’=>’三级栏目一’),
* 7 => array(‘id’=>’7′,’parentid’=>3,’name’=>’三级栏目二’)
* )
*/
function tree($arr=array())
{
$this->arr = $arr;
$this->ret = "";
return is_array($arr);
}
/**
* 得到父级数组
* @param int
* @return array
*/
function get_parent($myid)
{
$newarr = array();
if(!isset($this->arr[$myid])) return false;
$pid = $this->arr[$myid][‘pid’];
$pid = $this->arr[$pid][‘pid’];
if(is_array($this->arr))
{
foreach($this->arr as $id => $a)
{
if($a[‘pid’] == $pid) $newarr[$id] = $a;
}
}
return $newarr;
}
/**
* 得到子级数组
* @param int
* @return array
*/
function get_child($myid)
{
$a = $newarr = array();
if(is_array($this->arr))
{
foreach($this->arr as $id => $a)
{
if($a[‘pid’] == $myid) $newarr[$id] = $a;
}
}
return $newarr ? $newarr : false;
}
/**
* 得到当前位置数组
* @param int
* @return array
*/
function get_pos($myid,&$newarr)
{
$a = array();
if(!isset($this->arr[$myid])) return false;
$newarr[] = $this->arr[$myid];
$pid = $this->arr[$myid][‘pid’];
if(isset($this->arr[$pid]))
{
$this->get_pos($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
*/
function get_tree($myid,$str,$sid=0,$adds=”)
{
$number=1;
$child = $this->get_child($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 : ”;
$selected = $id==$sid ? "selected" : ”;
@extract($a);
eval("\$nstr = \"$str\";");
$this->ret .= $nstr;
$this->get_tree($id,$str,$sid,$adds.$k.’ ’);
$number++;
}
}
return $this->ret;
}
}
?>
[/php]
在所有栏目、地区等下拉菜单中,这个类非常好用。
使用方法:
[php]
<?php
include("tree.class.php");
//具有这个结构的数组,不是这样的话,可以改类的实现
$list=array(
1 => array(‘id’=>’1′,’pid’=>0,’name’=>’一级栏目一’),
2 => array(‘id’=>’2′,’pid’=>0,’name’=>’一级栏目二’),
3 => array(‘id’=>’3′,’pid’=>1,’name’=>’二级栏目一’),
4 => array(‘id’=>’4′,’pid’=>1,’name’=>’二级栏目二’),
5 => array(‘id’=>’5′,’pid’=>2,’name’=>’二级栏目三’),
6 => array(‘id’=>’6′,’pid’=>3,’name’=>’三级栏目一’),
7 => array(‘id’=>’7′,’pid’=>3,’name’=>’三级栏目二’)
);
$tree=new tree($list);
$html="<select name=’cat’>";
//格式字符串
$str="<option value=\$id \$selected>\$spacer\$name</option>";
//返回树
$html.=$tree->get_tree(0,$str);
$html.="</select>";
echo($html);
?>
[/php]
如果下标是从0开始的话,可以修改选中的记录为ID
$selected = $child[$id][‘id’]==$sid ? ‘selected’ : ”;