0

0

关于递归算法的讨论

php中文网

php中文网

发布时间:2016-06-23 14:00:43

|

1167人浏览过

|

来源于php中文网

原创

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

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


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

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

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载

回复讨论(解决方案)

 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 生成树型结构的基本代码,例如:""	* @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 = "
    \$spacer\$name
";echo $tree->get_tree(0,$str);?>

 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 生成树型结构的基本代码,例如:""	* @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 = "
    \$spacer\$name
";echo $tree->get_tree(0,$str);?>


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

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

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

嗯嗯,谢谢!

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号