递归与迭代学习(联级目录的创建与删除)

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

 

?>

 

 
图片
 
 

你可能感兴趣的:(递归)