PHP实现递归目录的5种方法


Posted in PHP onOctober 27, 2016

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

方法一:使用glob循环

<?php
//方法一:使用glob循环
 
function myscandir1($path, &$arr) {
 
  foreach (glob($path) as $file) {
    if (is_dir($file)) {
      myscandir1($file . '/*', $arr);
    } else {
 
      $arr[] = realpath($file);
    }
  }
}
?>

方法二:使用dir && read循环

<?php
//方法二:使用dir && read循环
function myscandir2($path, &$arr) {
 
  $dir_handle = dir($path);
  while (($file = $dir_handle->read()) !== false) {
 
    $p = realpath($path . '/' . $file);
    if ($file != "." && $file != "..") {
      $arr[] = $p;
    }
 
    if (is_dir($p) && $file != "." && $file != "..") {
      myscandir2($p, $arr);
    }
  }
}
?>

方法三:使用opendir && readdir循环

<?php
//方法三:使用opendir && readdir循环
function myscandir3($path, &$arr) {
   
  $dir_handle = opendir($path);
  while (($file = readdir($dir_handle)) !== false) {
 
    $p = realpath($path . '/' . $file);
    if ($file != "." && $file != "..") {
      $arr[] = $p;
    }
    if (is_dir($p) && $file != "." && $file != "..") {
      myscandir3($p, $arr);
    }
  }
}
 ?>

 方法四:使用scandir循环
 

<?php
//方法四:使用scandir循环
function myscandir4($path, &$arr) {
   
  $dir_handle = scandir($path);
  foreach ($dir_handle as $file) {
 
    $p = realpath($path . '/' . $file);
    if ($file != "." && $file != "..") {
      $arr[] = $p;
    }
    if (is_dir($p) && $file != "." && $file != "..") {
      myscandir4($p, $arr);
    }
  }
}
 ?>

方法五:使用SPL循环

<?php
//方法五:使用SPL循环
function myscandir5($path, &$arr) {
 
  $iterator = new DirectoryIterator($path);
  foreach ($iterator as $fileinfo) {
 
    $file = $fileinfo->getFilename();
    $p = realpath($path . '/' . $file);
    if (!$fileinfo->isDot()) {
      $arr[] = $p;
    }
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
      myscandir5($p, $arr);
    }
  }
}
?>

 可以用xdebug测试运行时间

<?php
myscandir1('./Code',$arr1);//0.164010047913 
myscandir2('./Code',$arr2);//0.243014097214 
myscandir3('./Code',$arr3);//0.233012914658 
myscandir4('./Code',$arr4);//0.240014076233
myscandir5('./Code',$arr5);//0.329999923706
 
 
//需要安装xdebug
echo xdebug_time_index(), "\n";
?>

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

PHP 相关文章推荐
PHP删除数组中特定元素的两种方法
Jul 02 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
PHP实现根据银行卡号判断银行
Apr 29 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
微信企业转账之入口类分装php代码
Oct 01 PHP
YII2框架中actions的作用与使用方法示例
Mar 13 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
PHP XML和数组互相转换详解
Oct 26 #PHP
You might like
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
自定义vue全局组件use使用、vuex的使用详解
2017/06/14 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
Python 文件读写操作实例详解
2014/03/12 Python
Python实现从百度API获取天气的方法
2015/03/11 Python
python从入门到精通(DAY 3)
2015/12/20 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
Python开发之pip安装及使用方法详解
2020/02/21 Python
python 穷举指定长度的密码例子
2020/04/02 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
keras.layer.input()用法说明
2020/06/16 Python
Python: glob匹配文件的操作
2020/12/11 Python
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
小学数学国培感言
2014/03/10 职场文书
年终晚会主持词
2014/03/25 职场文书
幼儿园园长新年寄语
2015/08/17 职场文书
《去年的树》教学反思
2016/02/18 职场文书
Android 中的类文件和类加载器详情
2022/06/05 Java/Android
vue中data里面的数据相互使用方式
2022/06/05 Vue.js