方法一代码:
path = ‘./a/b/c/d/e/f‘; $path_arr = explode(‘/‘,$path);//得到数组array(‘.‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘); for($i=0;$i<count($path_arr);$i++){ static $dir;//只初始化一次,保留上次调用的值 $dir .= $path_arr[$i].‘/‘;//i=0 ./ i=1 ./a i=2 ./a/b ..... //echo $dir,‘<br/>‘; if(!is_dir($dir)){//过滤下 如果已经是目录就不创建 比如 ./ echo mkdir($dir)?‘ok<br/>‘:‘fail<br/>‘;//创建 } }
方法二代码:
function mk_dir($dir){ //$dir_arr = array();//定义一个空数组用来存放路径 可以把它想象成为一个工作单 while(!is_dir($dir)){ //如果$dir不是目录 那么就表示这个工作还没做 因此就放入工作单里 array_push($dir_arr,$dir); $dir = dirname($dir);//取得上级目录在赋值给$dir } //上面是把新工作(不是目录的)存入到数组 while(count($dir_arr)){ $list = array_pop($dir_arr); mkdir($list); } //通过出栈 来层层创建目录 } $path =‘./a/b/c/d‘; mk_dir($path);
模拟过程:
$dir = ‘./a/b/c/d‘;
$dir 不是目录,进入循环
$dir_arr =array(‘./a/b/c/d‘);
$dir = dirname($dir)=‘./a/b/c‘;
$dir 不是目录,进入循环
$dir_arr =array(‘./a/b/c/d‘,‘./a/b/c‘);
$dir = dirname($dir)=‘./a/b‘;
$dir 不是目录,进入循环
$dir_arr =array(‘./a/b/c/d‘,‘./a/b/c‘,‘./a/b‘);
$dir = dirname($dir)=‘./a‘;
$dir 不是目录,进入循环
$dir_arr =array(‘./a/b/c/d‘,‘./a/b/c‘,‘./a/b‘,‘./a‘);
$dir = dirname($dir)=‘./‘;
$dir 是目录,退出循环
------------------------------------------------
<退出循环后的数组>array(‘./a/b/c/d‘,‘./a/b/c‘,‘./a/b‘,‘./a‘);
进入 出栈循环
count($dir_arr) =4 进入循环
$list = array_pop($dir_arr) = ‘./a‘;
mkdir($list);//a目录创建
count($dir_arr) =3 进入循环
$list = array_pop($dir_arr) = ‘./a/b‘;
mkdir($list);//a/b目录创建
count($dir_arr) =2 进入循环
$list = array_pop($dir_arr) = ‘./a/b/c‘;
mkdir($list);//a/b/c目录创建
count($dir_arr) =1 进入循环
$list = array_pop($dir_arr) = ‘./a/b/c/d‘;
mkdir($list);//a/b/c/d目录创建
count($dir_arr) =0 退出循环
----------------------------------------
总结:递归换成迭代的 要 借助栈的思想或者static
级联创建目录的思想 还是想必须把上级目录创建成功