如何从Directory Iterator循环中排除文件类型

Wyc*_*yck 3 php directory spl iterator file

简单的目录迭代器,它是递归的并显示所有文件和目录/子目录.

我没有看到任何内置的功能,以排除某些文件类型,例如在下面的例子中,我不希望输出的任何图像相关的文件,如.jpg,.png等我知道有这样做的几种方法,寻求建议哪个是最好的.

$scan_it = new RecursiveDirectoryIterator("/example_dir");

 foreach(new RecursiveIteratorIterator($scan_it) as $file) {

  echo $file;
  }
Run Code Online (Sandbox Code Playgroud)

Age*_*rum 11

更新: 好的,所以我是个白痴.PHP内置了这个:pathinfo()

试试这个:

$filetypes = array("jpg", "png");
$filetype = pathinfo($file, PATHINFO_EXTENSION);
if (!in_array(strtolower($filetype), $filetypes)) {
  echo $file;
}
Run Code Online (Sandbox Code Playgroud)

原答案:

为什么不运行substr()文件名并查看它是否与要排除的文件类型的扩展名匹配:

$scan_it = new RecursiveDirectoryIterator("/example_dir");

foreach(new RecursiveIteratorIterator($scan_it) as $file) {
  if (strtolower(substr($file, -4)) != ".jpg" && 
      strtolower(substr($file, -4)) != ".jpg") {
    echo $file;
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用正则表达式使其更容易:

if (!preg_match("/\.(jpg|png)*$/i", $file, $matches)) {
   echo $file;
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用数组来跟踪文件类型:

$filetypes = array("jpg", "png");
if (!preg_match("/\.(" . implode("|", $filetypes) . ")*$/i", $file, $matches)) {
   echo $file;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您足够幸运能够使用 PHP 5.3.6 或更高版本,那么 `$file` 本身也可以使用 [`getExtension()`](http://php.net/splfileinfo.getextension) 方法。 (2认同)

Ozz*_*ech 5

从 PHP 5.4 开始可以使用\RecursiveCallbackFilterIterator

$iterator = new \RecursiveDirectoryIterator(getcwd(), \RecursiveDirectoryIterator::SKIP_DOTS);

$iterator = new \RecursiveCallbackFilterIterator(
  $iterator,
  function ($item) {
    return $item->getExtension() === 'php' ? true : false;
  }
);
Run Code Online (Sandbox Code Playgroud)

迭代器现在将只包含 PHP 文件。

 foreach($iterator as $file) {
   echo $file;
 }
Run Code Online (Sandbox Code Playgroud)