php-迭代创建级联目录

方法一代码:

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

            级联创建目录的思想 还是想必须把上级目录创建成功

         

  

原文地址:https://www.cnblogs.com/YangJieCheng/p/5686828.html