PHP遍历目录文件的常用方法小结


Posted in PHP onFebruary 03, 2017

本文实例总结了PHP遍历目录文件的常用方法。分享给大家供大家参考,具体如下:

测试算法(源代码经过本站工具http://tools.3water.com/code/3water_php_format进行格式化处理,以便于读者阅读)

算法1.简短系

foreach(glob('*.*') as $filename)
{
  echo 'Filename:'.$filename.;
}

算法2.规矩系

if($handle = opendir('C:\\Inetpub\\wwwroot\\test\\')){
  echo "Files:\n";
  while (false !== ($file = readdir($handle))){
    echo "$file\n";
  }
  closedir($handle);
}

算法3.函数系

function tree($directory)
{
  $mydir=dir($directory);
  while($file=$mydir->read()){
    if((is_dir("$directory/$file")) AND ($file!=".") AND ($file!=".."))
    {
      echo "$file\n";
      tree("$directory/$file");
    } else
    echo "$file\n";
  }
  echo "\n";
  $mydir->close();
}
tree("C:\\Inetpub\\wwwroot\\test\\");

算法4.函数系II

function listDir($dir){
  if(is_dir($dir)){
    if ($dh = opendir($dir)) {
      while (($file= readdir($dh)) !== false){
        if((is_dir($dir."/".$file)) && $file!="." && $file!=".."){
          echo "文件名:",$file;
          listDir($dir."/".$file."/");
        } else{
          if($file!="." && $file!=".."){
            echo $file;
          }
        }
      }
      closedir($dh);
    }
  }
}
listDir("C:\\Inetpub\\wwwroot\\test\\");

算法5.递归系

function file_list($dir,$pattern="")
{
  $arr=array();
  $dir_handle=opendir($dir);
  if($dir_handle)
  {
    while(($file=readdir($dir_handle))!==false)
    {
      if($file==='.' || $file==='..')
      {
        continue;
      }
      $tmp=realpath($dir.'/'.$file);
      if(is_dir($tmp))
      {
        $retArr=file_list($tmp,$pattern);
        if(!emptyempty($retArr))
        {
          $arr[]=$retArr;
        }
      } else
      {
        if($pattern==="" || preg_match($pattern,$tmp))
        {
          $arr[]=$tmp;
        }
      }
    }
    closedir($dir_handle);
  }
  return $arr;
}
print_r(file_list("C:\\Inetpub\\wwwroot\\test\\"));

测试方法

我们采取在测试代码的头部和尾部添加如下的内容来检测执行时间,并测试5次取平均结果作为最终成绩。

$stime=microtime(true);
//测试代码
//......
//......
$etime=microtime(true);
$total=($etime-$stime)*1000;
echo "{$total} Millisecond(s)";

测试结果:

算法1

算法1在浏览器能正确输出所有项目,5次测验耗费的时间分别是:

平均用时=3803.618621824 毫秒

算法2

算法2在浏览器也能正确输出所有项目,但在开头会给出“..”(上级目录)的信息。5次测验耗费的时间分别是:

平均用时=381.0853481294 毫秒

算法3

算法3在浏览器能正确输出所有项目,也仍会给出“..”(上级目录)的信息。5次测验耗费的时间分别是:

平均用时=24299.2805485 毫秒

算法4

算法4和算法3类似,在浏览器能正确输出所有项目,5次测验耗费的时间分别是:

平均用时=24020.66812516 毫秒

算法5

算法5曾一度让我以为IIS又出问题了。虽说它在浏览器能正确输出所有项目,但数据的结果默认为数组。5次测验耗费的时间分别是:

平均用时=61411.31243706 毫秒

测试总结

根据测试结果,我们很容易得出下面的速度排名。

算法2 > 算法1 > 算法4 >  算法3 > 算法5

为什么算法2要比其他算法都高效一些呢?

实际上是因为算法中只使用了php中内置用来读取目录内容的函数“readdir()” 。除了算法1以外,其他算法在引用readdir()的时候,为了弥补函数的先天不足,干了很多其他的事情。

如果说,我们需要指定扩展名的列举目录内所有文件的话。Rt推荐使用算法1的模式,我们将代码写成这样就可以了。

foreach(glob('*.需要的扩展名') as $filename)
{
  echo 'Filename:'.$filename.;
}

结语

不管作为一个代码新手还是一个资深的程序员,在堆砌代码的时候,更应该关注程序的效率和安全。

请不要忽略任何一种可能,也请不要让孩子般的代码成为拖累服务器的罪魁祸首。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
Jul 01 PHP
php打印输出棋盘的实现方法
Dec 23 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
php实现插入排序
Mar 29 PHP
php备份数据库类分享
Apr 14 PHP
php上传图片类及用法示例
May 11 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
Sep 11 PHP
Thinkphp结合ajaxFileUpload实现异步图片传输示例
Mar 13 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 PHP
TP5框架实现的数据库备份功能示例
Apr 05 PHP
详解yii2实现分库分表的方案与思路
Feb 03 #PHP
php获取客户端IP及URL的方法示例
Feb 03 #PHP
php观察者模式应用场景实例详解
Feb 03 #PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 #PHP
php使用curl代理实现抓取数据的方法
Feb 03 #PHP
php实现xml转换数组的方法示例
Feb 03 #PHP
php删除txt文件指定行及按行读取txt文档数据的方法
Jan 30 #PHP
You might like
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
基于jQuery试卷自动排版系统
2010/07/18 Javascript
JavaScript 设计模式 安全沙箱模式
2010/09/24 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
js实现3D图片环展示效果
2017/03/09 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Vue表单提交点击事件只允许点击一次的实例
2020/10/23 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
分享Python切分字符串的一个不错方法
2018/12/14 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
python3让print输出不换行的方法
2020/08/24 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
搞笑获奖感言
2014/01/30 职场文书
英语系本科生求职信
2014/07/15 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
导游词之河北邯郸
2019/09/12 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
JavaScript实例 ODO List分析
2022/01/22 Javascript