RecursiveDirectoryIterator以回显由文件夹分隔的列表

时间:2017-09-10 12:15:14

标签: php recursion echo

RecursiveDirectoryIterator有没有办法根据文件夹分别回显子文件夹中的文件,而不是全部在一起?

这是我的例子。我有一个文件夹(事件),它有多个子文件夹(徽标,人物,乐队)。但是子文件夹的名称因某些事件而异,所以我不能简单地设置这三个内部,我需要一个"通配符"选项。 当我使用RecursiveDirectoryIterator来回显出这些文件夹中的所有图像时,它可以工作,但我想根据子文件夹将它们分开,因此它会回显文件夹名称和下面的所有图像,然后重复下一个文件夹,依此类推。

现在我用它:

<?php 
$directory = "path/to/mainfolder/";
foreach (new RecursiveIteratorIterator(new 
RecursiveDirectoryIterator($directory,RecursiveDirectoryIterator::SKIP_DOTS)) as $filename)
{
  echo '<img src="'.$filename.'">';
}
?>

那么,我怎么做这样的回声:
标志
图像,图像,图像
人们
图像,图像,图像
...

提前感谢任何有用的提示和想法。

1 个答案:

答案 0 :(得分:1)

对我来说,当你将对象放入具有描述性名称的变量时,代码更具可读性,然后在实例化其他类时传递它们。我已使用RegexIterator()而不是RecursiveFilterIterator()来过滤图片文件扩展名(例如,我们不想扩展RecursiveFilterIterator()类)。其余的代码是简单的迭代,提取字符串和分页 注意:没有错误处理,最好添加try / catch来管理异常

<?php
$directory = 'path/to/mainfolder/';

$objRecursiveDirectoryIterator = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS);
$objRecursiveIteratorIterator = new RecursiveIteratorIterator($objRecursiveDirectoryIterator);
// use RegexIterator() to grab only image file extensions
$objRegexIterator = new RegexIterator($objRecursiveIteratorIterator, "~^.+\.(bmp|gif|jpg|jpeg|img)$~i", RecursiveRegexIterator::GET_MATCH);

$lastPath = '';
// iterate through all the results
foreach ($objRegexIterator as $arrMatches) {
    $filename = $arrMatches[0];
    $pos = strrpos($filename, DIRECTORY_SEPARATOR); // find position of last DIRECTORY_SEPARATOR
    $path = substr($filename, 0, $pos); // path is everything before
    $file = substr($filename, $pos + 1); // file is everything after
    $myDir = substr($path, strrpos($path, DIRECTORY_SEPARATOR) + 1); // directory the file sits in
    if ($lastPath !== $path) { // is the path the same as the last
        // display page break and header
        if ($lastPath !== '') {
            echo "<br />\n";
            echo "<br />\n";
        }
        echo $myDir ."<br />\n";
        $lastPath = $path;
    }
    echo $file . " ";
}