Maison > développement back-end > tutoriel php > 关于递归算法的讨论

关于递归算法的讨论

WBOY
Libérer: 2016-06-23 14:00:43
original
983 Les gens l'ont consulté

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

<?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',),);?>
Copier après la connexion


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

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


回复讨论(解决方案)

<?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);?>
Copier après la connexion
Copier après la connexion

<?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);?>
Copier après la connexion
Copier après la connexion


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

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

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

嗯嗯,谢谢!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal