日期:2014-05-16  浏览次数:20589 次

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


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


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

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

------解决方案--------------------

<?php
/**
* 通用的树型类,可以生成任何树型结构
 */
header("content-type:text/html;charset=utf-8");
class tree {
/**
* 生成树型结构所需要的2维数组
* @var array
*/
public $arr = array();

/**
* 生成树型结构所需修饰符号,可以换成图片
* @var array
*/
public $icon = array('│','├','└');
public $nbsp = "&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;
}

    /**
* 得到子级数组