PHP获取文件列表,包括子目录

Was*_*urn 26 php glob

我试图检索目录中的所有图像,包括所有子目录.我目前正在使用

$images = glob("{images/portfolio/*.jpg,images/portfolio/*/*.jpg,images/portfolio/*/*/*.jpg,images/portfolio/*/*/*/*.jpg}",GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)

这有效,但结果如下:

images/portfolio/1.jpg
images/portfolio/2.jpg
images/portfolio/subdirectory1/1.jpg
images/portfolio/subdirectory1/2.jpg
images/portfolio/subdirectory2/1.jpg
images/portfolio/subdirectory2/2.jpg
images/portfolio/subdirectory1/subdirectory1/1.jpg
images/portfolio/subdirectory1/subdirectory1/2.jpg
Run Code Online (Sandbox Code Playgroud)

我希望它一次做一个完整的目录分支,结果如下:

images/portfolio/1.jpg
images/portfolio/2.jpg
images/portfolio/subdirectory1/1.jpg
images/portfolio/subdirectory1/2.jpg
images/portfolio/subdirectory1/subdirectory1/1.jpg
images/portfolio/subdirectory1/subdirectory1/2.jpg
images/portfolio/subdirectory2/1.jpg
images/portfolio/subdirectory2/2.jpg
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助,欢呼!

PS如果我可以将所有子目录放在投资组合下而不必使用通配符明确说明每个目录,那也是很棒的.

diE*_*cho 29

来自glob示例

if ( ! function_exists('glob_recursive'))
{
    // Does not support flag GLOB_BRACE        
   function glob_recursive($pattern, $flags = 0)
   {
     $files = glob($pattern, $flags);
     foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir)
     {
       $files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
     }
     return $files;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢diEcho,在发布之前只看了该页面,完全错过了该示例。干杯! (2认同)
  • 恩... foreach循环中的array_merge不太漂亮。 (2认同)

T.T*_*dua 20

方案:

<?php
$path = realpath('yourfolder/examplefolder');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
{
        echo "$filename</br>";
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 这是最聪明,最优雅的答案+1 (2认同)
  • 这如何处理文件名模式? (2认同)

And*_*anu 6

这是一个更简单的方法:

而不是使用:

$path = realpath('yourfolder/examplefolder/*');
glob($path);
Run Code Online (Sandbox Code Playgroud)

您必须使用:

$path = realpath('yourfolder/examplefolder').'/{**/*,*}';
glob($path, GLOB_BRACE);
Run Code Online (Sandbox Code Playgroud)

最后一个将使用大括号,实际上,这是此代码的简写:

$path = realpath('yourfolder/examplefolder');

$self_files = glob($path . '/*');
$recursive_files = glob($path . '/**/*');

$all_files = $self_files + $recursive_files; // That's the result you want
Run Code Online (Sandbox Code Playgroud)

您可能还想从结果中过滤目录。glob()函数具有GLOB_ONLYDIR标志。让我们用它来区分结果。

$path =  realpath('yourfolder/examplefolder/') . '{**/*,*}';

$all_files = array_diff(
  glob($path, GLOB_BRACE),
  glob($path, GLOB_BRACE | GLOB_ONLYDIR)
);
Run Code Online (Sandbox Code Playgroud)

  • realpath()不接受超过1个参数,我也不相信它也支持glob模式。 (3认同)