关于递归算法的讨论

小雨青年
PHP领域优质创作者
博客专家认证
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',),
);
?>


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

另外,我查资料,发现还能用指针,学生道行尚浅,请各位多多指教!!!
...全文
291 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小雨青年 2014-03-14
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
精华区有太多的相关帖子,建议你先看一下 一般只在找不到或不满意别人的经验时,才自己创新
嗯嗯,谢谢!
xuzuning 2014-03-14
  • 打赏
  • 举报
回复
精华区有太多的相关帖子,建议你先看一下 一般只在找不到或不满意别人的经验时,才自己创新
小雨青年 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);

?>

  在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 《算法导论(原书第3版)》选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在it专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。    第3版的主要变化:    新增了van emde boas树和多线程算法,并且将矩阵基础移至附录。    修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。    移除两章很少讲授的内容:二项堆和排序网络。    修订了动态规划和贪心算法相关内容。    流网络相关材料现在基于边上的全部流。    由于关于矩阵基础和strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。    修改了对knuth-morris-pratt字符串匹配算法的讨论。    新增100道练习和28道思考题,还更新并补充了参考文献。

20,360

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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