关于递归调用的问题

chenxu1982 2013-10-29 02:29:05
我现在有一个数组,希望通过递归来实现分级
类似于树状,想要实现的效果如下:
标志(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三厢 ) )

我想问下,这样的结构能用递归来实现吗?如果是无限级的目录的话用这样的数组结构也可以实现吗?

...全文
153 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hx_Moon_ 2013-10-31
  • 打赏
  • 举报
回复
上面的树类是我在phpcms上扣下来整理的,可以放在apache目录下直接运行就可以看到效果,另外精华区有xuzuning版主各种树类。
Hx_Moon_ 2013-10-31
  • 打赏
  • 举报
回复

<?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);
?>

chenxu1982 2013-10-31
  • 打赏
  • 举报
回复
多谢哈,参考了你给的这个代码,我改进了下自己的代码及数组结构,现在已经把该功能搞定了,多谢!给分

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧