我现在有一个数组,希望通过递归来实现分级
类似于树状,想要实现的效果如下:
标志(ID为1)
|_307
|_307两厢
|_307三厢
|_308
|_308两厢
|_308三厢
别克(ID为4)定义的数组为
Array ( [1] => Array ( [1] => Array ( [2] => Array ( [0] => 307 ) [5] => Array ( [0] => 308 ) ) [2] => Array ( [3] => Array ( [0] => 307二厢 ) [7] => Array ( [0] => 307三厢 ) ) [5] => Array ( [6] => Array ( [0] => 308二厢 ) [8] => Array ( [0] => 308三厢 ) ) ) [4] => Array ( ) ).其中别克现在为空数组,即[4] => array()
标志里的数组即 [1] => Array( [1] => Array ( [2] => Ar .......
其中的匹配方法为;
[2] => Array ( [0] => 307 ) 的子级为 [2] => Array ( [3] => Array ( [0] => 307二厢 ) [7] => Array ( [0] => 307三厢 ) )[5] => Array ( [0] => 308 ) 的子级为 [5] => Array ( [6] => Array ( [0] => 308二厢 ) [8] => Array ( [0] => 308三厢 ) )我想问下,这样的结构能用递归来实现吗?如果是无限级的目录的话用这样的数组结构也可以实现吗?递归
类似于树状,想要实现的效果如下:
标志(ID为1)
|_307
|_307两厢
|_307三厢
|_308
|_308两厢
|_308三厢
别克(ID为4)定义的数组为
Array ( [1] => Array ( [1] => Array ( [2] => Array ( [0] => 307 ) [5] => Array ( [0] => 308 ) ) [2] => Array ( [3] => Array ( [0] => 307二厢 ) [7] => Array ( [0] => 307三厢 ) ) [5] => Array ( [6] => Array ( [0] => 308二厢 ) [8] => Array ( [0] => 308三厢 ) ) ) [4] => Array ( ) ).其中别克现在为空数组,即[4] => array()
标志里的数组即 [1] => Array( [1] => Array ( [2] => Ar .......
其中的匹配方法为;
[2] => Array ( [0] => 307 ) 的子级为 [2] => Array ( [3] => Array ( [0] => 307二厢 ) [7] => Array ( [0] => 307三厢 ) )[5] => Array ( [0] => 308 ) 的子级为 [5] => Array ( [6] => Array ( [0] => 308二厢 ) [8] => Array ( [0] => 308三厢 ) )我想问下,这样的结构能用递归来实现吗?如果是无限级的目录的话用这样的数组结构也可以实现吗?递归
<?php
/**
* 通用的树型类,可以生成任何树型结构
*/
header("content-type:text/html;charset=utf-8");
class tree {
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $arr = array(); /**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public $icon = array('│','├','└');
public $nbsp = " "; /**
* @access private
*/
public $ret = ''; /**
* 构造函数,初始化类
* @param array 2维数组,例如:
* array(
* 1 => array('id'=>'1','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'=>'三级栏目二')
* )
*/
public function __construct($arr=array()){
$this->arr = $arr;
$this->ret = '';
return is_array($arr);
} /**
* 得到子级数组
* @param int
* @return array
*/
public function get_child($myid)
{
//$a =
$newarr = array();
if(is_array($this->arr))
{
foreach($this->arr as $id => $a)
{
if($a['parentid'] == $myid)
{
$newarr[$id] = $a;
}
}
}
return $newarr ? $newarr : false;
} /**
* 得到树型结构
* @param int ID,表示获得这个ID下的所有子级
* @param string 生成树型结构的基本代码,例如:"<option value=\$id \$selected>\$spacer\$name</option>"
* @param int 被选中的ID,比如在做树型下拉框的时候需要用到
* @return string
*/
public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
{
$number=1;
$child = $this->get_child($myid);
if(is_array($child))
{
$total = count($child);
foreach($child as $id=>$value)
{
$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($value);//此方法为下面的字符变量赋上相应的键值 $nstr,$str_group
$parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";");
$this->ret .= $nstr;
$nbsp = $this->nbsp;
$this->get_tree($id, $str, $sid, $adds.$k.$nbsp,$str_group); //如果子集是数组,递归调用 此处注意$adds参数
$number++;
}
}
return $this->ret;
}
}
$arr= array(
1 => array('id'=>'1','parentid'=>0,'name'=>'世界'),
3 => array('id'=>'3','parentid'=>1,'name'=>'中国'),
4 => array('id'=>'4','parentid'=>1,'name'=>'美国'),
5 => array('id'=>'5','parentid'=>3,'name'=>'湖南'),
6 => array('id'=>'6','parentid'=>3,'name'=>'北京'),
7 => array('id'=>'7','parentid'=>4,'name'=>'纽约'),
7 => array('id'=>'7','parentid'=>5,'name'=>'长沙')
);
$tree = new tree($arr);
$str = "<ul value=\$id >\$spacer\$name</ul>";
echo $tree->get_tree(0,$str);
?>