一般来说,递归和迭代是可以互相转换的。
迭代是有点类似栈的概念,后进先出,
可以使用 array_pop 和array_push函数来用数组来实现栈的概念。
下面看两个程序,及实现图就懂了:
迭代是有点类似栈的概念,后进先出,
可以使用 array_pop 和array_push函数来用数组来实现栈的概念。
下面看两个程序,及实现图就懂了:
/*************************************************************************************************** 递归法创建和删除联级目录 ****************************************************************************************************/ <?php //递归创建目录,完成一次性 ./a/b/c/d/e目录 //方法一 function mk_dir($path){ //运气非常好,这个目录存在,这样返回TRUE就可以了 if(is_dir($path)){ return true; } //运气一般,目录的父目录存在 if(is_dir(dirname($path))){ return mkdir($path); } //运气较差,父目录也不存在,创建父目录 mk_dir(dirname($path)); return mkdir($path); } echo mk_dir('./a/ba/c/d/e/f')?'OK':"false"; //方法二: function mk_dir2($path){ //如果目录已经存在,直接返回 if(is_dir($path)) return true; //如果父目录不存在则创建 父目录存在或者创建一个父目录 return is_dir(dirname($path))||mk_dir2(dirname($path))?mkdir($path):false; } echo mk_dir2('./a/b/c/d/e/f')?'OK':"false"; //方法三 使用php5.0以后的自带的函数 echo mkdir('./a/bss/c/d/e/f',077,true)?'OK':"false"; //递归删除目录 function deldir($path){ if(!is_dir($path)){ return NULL; } $dh = opendir($path); while(($row = readdir($dh))!== false){ if($row == '.' || $row == '..'){ continue; } //echo "<br/>",$path.'/'.$row." delete successful"; //判读是否是普通文件 if(!is_dir($path.'/'.$row)){ unlink($path.'/'.$row); }else{ deldir($path.'/'.$row); } } closedir($dh); rmdir($path); echo "<br/>",$path." delete successful"; return true; } echo deldir('./a')?"<br/>删除成功":"<br/>删除失败"; ?>
结果图:
/*************************************************************************************************** 迭代法创建和删除联级目录 ****************************************************************************************************/ <?php //迭代创建目录 //./a/b/c/d/e/f/g function mk_dir($path){ $arr = array(); while(!is_dir($path)){ //如果还不是目录则是我的工作 ////往数组最后一个单元压入要创建的目录 //array_push($arr,$path); //往数组开头一个单元压入要创建的目录 array_unshift($arr,$path); //获取父目录 $path = dirname($path); } //print_r($arr); if(empty($arr)){ echo "<br/>the directory is exists!"; return true; } foreach($arr as $v){ echo "<br/>Create new directoty successful for $v"; mkdir($v); } while(($path_dir = array_pop($arr))!== null){ echo "<br/>delete directoty successful for $path_dir"; rmdir($path_dir); } return true; } mk_dir("./a/b/c/d/e/f/g/h"); ?>