首页 > 技术文章 > 递归与迭代学习(联级目录的创建与删除)

lihaiyan 2015-02-05 12:00 原文

一般来说,递归和迭代是可以互相转换的。
迭代是有点类似栈的概念,后进先出,
可以使用 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");
 
?>

 

 
图片
 
 

推荐阅读