关于递归算法的讨论

邻座的小雨同学 2014-03-13 10:51:34
小弟是还没毕业的学生,现在在实习做一个项目,又遇到了递归问题,希望大家帮助!
问题很简单,经典的递归遍历数组的问题


<?php
$arr=array(
'0'=>array( 'id'=>'1','name'=>'角色管理','pid'=>'0',),
'1'=>array( 'id'=>'2','name'=>'添加角色','pid'=>'1',),
'2'=>array( 'id'=>'3','name'=>'角色列表','pid'=>'2',),
'3'=>array( 'id'=>'4','name'=>'菜单管理','pid'=>'0',),
'4'=>array( 'id'=>'5','name'=>'前台管理','pid'=>'4',),
'5'=>array( 'id'=>'6','name'=>'添加','pid'=>'5',),
'6'=>array( 'id'=>'7','name'=>'修改','pid'=>'5',),
'7'=>array( 'id'=>'8','name'=>'列表','pid'=>'5',),
'8'=>array( 'id'=>'9','name'=>'后台管理','pid'=>'4',),
'9'=>array( 'id'=>'10','name'=>'添加','pid'=>'9',),
'10'=>array( 'id'=>'11','name'=>'修改','pid'=>'9',),
'11'=>array( 'id'=>'12','name'=>'列表','pid'=>'9',),
);
?>


就是这个样子,递归遍历,要生成的有两个结果。
一个是标准的层级关系的数组
还有一个是用于放到下拉列表中的,

另外,我查资料,发现还能用指针,学生道行尚浅,请各位多多指教!!!
...全文
122 点赞 收藏 4
写回复
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 3 楼 xuzuning 的回复:
精华区有太多的相关帖子,建议你先看一下 一般只在找不到或不满意别人的经验时,才自己创新
嗯嗯,谢谢!
回复
xuzuning 2014-03-14
精华区有太多的相关帖子,建议你先看一下 一般只在找不到或不满意别人的经验时,才自己创新
回复
引用 1 楼 linux_PHP_ 的回复:

<?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'=>'一级栏目一'),
	*      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'=>'三级栏目二')
	*      )
	*/
	public function __construct($arr=array()){
       $this->arr = $arr;
	   $this->ret = '';
	   return is_array($arr);
	}

    /**
	* 得到父级数组
	* @param int
	* @return array
	*/
	public function get_parent($myid){
		$newarr = array();
		if(!isset($this->arr[$myid])) return false;
		$pid = $this->arr[$myid]['parentid'];
		$pid = $this->arr[$pid]['parentid'];
		if(is_array($this->arr))
		{
			foreach($this->arr as $id => $a)
			{
				if($a['parentid'] == $pid) $newarr[$id] = $a;
			}
		}
		return $newarr;
	}

    /**
	* 得到子级数组
	* @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
	* @return array
	*/
	public function get_pos($myid,&$newarr)
	{
		$a = array();
		if(!isset($this->arr[$myid])) return false;
        $newarr[] = $this->arr[$myid];
		$pid = $this->arr[$myid]['parentid'];
		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
	*/
	public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
	{
		$number=1;
		$child = $this->get_child($myid);
		print_r($child);
		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); //如果子集是数组,递归调用
				$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 \$selected>\$spacer\$name</ul>";
echo $tree->get_tree(0,$str);

?>

这个返回的是字符串,怎么可以返回数组呢?
回复
Hx_Moon_ 2014-03-13

<?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'=>'一级栏目一'),
	*      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'=>'三级栏目二')
	*      )
	*/
	public function __construct($arr=array()){
       $this->arr = $arr;
	   $this->ret = '';
	   return is_array($arr);
	}

    /**
	* 得到父级数组
	* @param int
	* @return array
	*/
	public function get_parent($myid){
		$newarr = array();
		if(!isset($this->arr[$myid])) return false;
		$pid = $this->arr[$myid]['parentid'];
		$pid = $this->arr[$pid]['parentid'];
		if(is_array($this->arr))
		{
			foreach($this->arr as $id => $a)
			{
				if($a['parentid'] == $pid) $newarr[$id] = $a;
			}
		}
		return $newarr;
	}

    /**
	* 得到子级数组
	* @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
	* @return array
	*/
	public function get_pos($myid,&$newarr)
	{
		$a = array();
		if(!isset($this->arr[$myid])) return false;
        $newarr[] = $this->arr[$myid];
		$pid = $this->arr[$myid]['parentid'];
		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
	*/
	public function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '')
	{
		$number=1;
		$child = $this->get_child($myid);
		print_r($child);
		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); //如果子集是数组,递归调用
				$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 \$selected>\$spacer\$name</ul>";
echo $tree->get_tree(0,$str);

?>

回复
发动态
发帖子
PHP
创建于2008-08-27

1.9w+

社区成员

“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
申请成为版主
社区公告
暂无公告