关于递归算法的讨论

WBOY
Release: 2016-06-23 14:00:43
Original
965 people have browsed it

小弟是还没毕业的学生,现在在实习做一个项目,又遇到了递归问题,希望大家帮助!
问题很简单,经典的递归遍历数组的问题

<?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',),);?>
Copy after login


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

另外,我查资料,发现还能用指针,学生道行尚浅,请各位多多指教!!!


回复讨论(解决方案)

<?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);?>
Copy after login
Copy after login

<?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);?>
Copy after login
Copy after login


这个返回的是字符串,怎么可以返回数组呢?

精华区有太多的相关帖子,建议你先看一下
一般只在找不到或不满意别人的经验时,才自己创新

精华区有太多的相关帖子,建议你先看一下
一般只在找不到或不满意别人的经验时,才自己创新

嗯嗯,谢谢!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template