php函数mkdir实现递归创建层级目录


Posted in PHP onOctober 27, 2016

下面是我从网上整理的资料,会为大家详细介绍php函数mkdir的具体用法,希望对有这方面需求的朋友有所帮助。

项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等。这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法。

php默认的mkdir一次只能创建一层目录,而要逐层创建各级目录的话,一般都是先从父创建,然后逐层往下创建,但是这样手工创建的话,有点太过于麻烦了。

我们写程序是做什么的?不久是为了能自动化实现我们需要的功能么,这里的方法就是为了能够通过程序帮我们自动创建完成层级目录。

思路有两种:

一、从上往下(父级→子级)

1.先判断 父级 目录是否存在,不存在则创建;
2.判断二级子目录是否存在,不能存在则创建,
3.在第二步中以子目录作为参数递归调用函数本身。

二、从下往上(子级→父级)

1.先判断最底层目录是否存在;
2.判断底层目录的上层目录是否存在,不存在则以上层目录作为参数递归进行。

以下是几种方法:

1:递归创建目录,此种方法是我目前感觉比较好的方法。

function mkDirs($dir){
  if(!is_dir($dir)){
    if(!mkDirs(dirname($dir))){
      return false;
    }
    if(!mkdir($dir,0777)){
      return false;
    }
  }
  return true;
}
mkDirs('1/2/3/');

2:递归创建级联目录,如果第一个方法不太理解的话,可以结合下面这个方法理解

function mkDirs1($path){
  if(is_dir($path)){//已经是目录了就不用创建
    return true;
  }
  if(is_dir(dirname($path))){//父目录已经存在,直接创建
    return mkdir($path);
  }
  mkDirs1(dirname($path));//从子目录往上创建
  return mkdir($path);//因为有父目录,所以可以创建路径
}
//mkDirs1('1/2/3/');

3:迭代创建级联目录

function makedir($path){
  $arr=array();
  while(!is_dir($path)){
    array_push($arr,$path);//把路径中的各级父目录压入到数组中去,直接有父目录存在为止(即上面一行is_dir判断出来有目录,条件为假退出while循环)
    $path=dirname($path);//父目录
  }
  if(empty($arr)){//arr为空证明上面的while循环没有执行,即目录已经存在
    echo $path,'已经存在';
    return true;
  }
  while(count($arr)){
    $parentdir=array_pop($arr);//弹出最后一个数组单元
    mkdir($parentdir);//从父目录往下创建
  }
}
makedir('1/2/3');

PS:有时候程序脚本的文件不一定在网站根目录,而创建的文件需要在根目录创建,那我们就需要用到网站根目录路径:$_SERVER['DOCUMENT_ROOT'];所以我不建议使用后面的三个方法。

以下三种是通过'/'分割路径的方法进行创建的。

function mk1($dir){
  $arr=explode("/",$dir);
  $path='';
  for($i=0;$i< count($arr);$i++){
    $path.=$arr[$i].'/';
    if(!is_dir($path)){
      mkdir($path,0777);
    }
  }
}

function mk2($dir){
  static $i=0;
  $path='';
  $arr=explode("/",$dir);
  if($i < count($arr)){
    $path.=$arr[$i];
    mkdir($path,0777,true);
    $i++;
    mk2($path."/");
  }
}
function mkdirs0($path){
  $dirs = explode('/',$path);
  for ($c=0;$c < count($dirs); $c++) {
    $thispath="";
    for ($cc=0; $cc <= $c; $cc++) {
      $thispath.=$dirs[$cc].'/';
    }
    if (!is_dir($thispath)) {
      mkdir($thispath,0777);
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php SQL防注入代码集合
Apr 25 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
php 邮件发送问题解决
Mar 22 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHP对称加密算法(DES/AES)类的实现代码
Nov 14 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
Jan 27 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
PHP实现递归目录的5种方法
Oct 27 #PHP
PHP读取大文件的几种方法介绍
Oct 27 #PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 #PHP
PHP中的密码加密的解决方案总结
Oct 26 #PHP
php 解析xml 的四种方法详细介绍
Oct 26 #PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
Oct 26 #PHP
php 生成签名及验证签名详解
Oct 26 #PHP
You might like
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
点击按钮出现60秒倒计时的简单js代码(推荐)
2016/06/07 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
vue最简单的前后端交互示例详解
2018/10/11 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
[05:49]2014DOTA2TI4正赛第二日综述 昔日冠军纷纷落马 VG LGD占尽先机
2014/07/20 DOTA
python使用turtle绘制分形树
2018/06/22 Python
基于django传递数据到后端的例子
2019/08/16 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
任命书模板
2014/06/04 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
水知道答案观后感
2015/06/08 职场文书
胡桃夹子观后感
2015/06/11 职场文书
《假如》教学反思
2016/02/17 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
导游词之湖北梁子湖
2019/11/07 职场文书