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 相关文章推荐
PHP 读取Postgresql中的数组
Apr 14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
Jun 23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
php实现的用户查询类实例
Jun 18 PHP
php实现的验证码文件类实例
Jun 18 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
win10下 php安装seaslog扩展的详细步骤
Dec 04 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使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
ExtJS Grid使用SimpleStore、多选框的方法
2009/11/20 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
Express的路由详解
2015/12/10 Javascript
实例讲解javascript注册事件处理函数
2016/01/09 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
jquery-mobile基础属性与用法详解
2016/11/23 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
python开头的coding设置方法
2019/08/08 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
2014年父亲节活动方案
2014/03/06 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
合作协议书
2014/04/23 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
营销与策划专业求职信
2014/06/20 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
房贷收入证明范本
2015/06/12 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
车间安全生产管理制度
2015/08/06 职场文书
高考升学宴主持词
2019/06/21 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL