【问题标题】:How can I exclude directories using RecursiveDirectoryIterator如何使用 RecursiveDirectoryIterator 排除目录
【发布时间】:2013-07-26 08:04:02
【问题描述】:

我有下面的功能。它遍历目录并递归搜索它们以获取随机图像文件,然后将其附加到帖子中。我想要做的是从搜索中排除一些文件。

我有一个逗号分隔的列表,我将它分解成一个数组,我尝试使用过滤器但无法让它工作。

当前没有过滤器的函数是

function swmc_get_imgs($start_dir, $ext, $exclude=array()){
$dir   = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($start_dir));
$files = array();

// Force array of extensions and make them all lower-case
if ( ! is_array($ext))
{
    $ext = (array) $ext;
}

$ext = array_unique(array_map('strtolower', $ext));

foreach($dir as $file)
{
    // Skip anything that isn't a file
    if ( ! $file->isFile())
        continue;

    // If the file has one of our desired extensions, add it to files array
    if (in_array(strtolower(pathinfo($file->getFilename(), PATHINFO_EXTENSION)), $ext)) {
        $files[] = $file->getPathname();
    }
}

return $files;
}

所以上述方法可行,但仍然相当昂贵,尤其是对于很多目录,因此我想排除存储在逗号列表中的目录列表。

我尝试了以下

class SwmcOnlyFilter extends RecursiveFilterIterator {
public function accept() {
    // Accept the current item if we can recurse into it
    // or it is a value starting with "test"
    return $this->hasChildren() || !in_array($this->current(),     explode(",",get_option('swmc_image_excl')));
}
}

然后将swmc_get_imgs函数的第一部分改为

$dirIterator = new RecursiveDirectoryIterator($start_dir);
$filter   = new SwmcOnlyFilter($dirIterator);
$dir   = new RecursiveIteratorIterator($filter);

但是过滤器不会跳过那个目录而是进入它。

目录可能看起来像

/uploads/2009/1/2011_pic.jpg
/uploads/2011/1/john_smith.jpg

等等。

因此,我可能希望将 2011 排除为目录,但不排除存在于 2009 年且标题为 2011 的图像。

澄清:

我可以通过在 foreach 循环中跳过它们来手动过滤掉它们,但这仍然会检查它们并浪费内存和时间。如果可能的话,我宁愿在抓取时跳过这些。

【问题讨论】:

    标签: php recursion filter iterator


    【解决方案1】:

    用下面的方法弄明白了

    function swmc_iterate_imgs($start_dir)  {
    $directory = $start_dir; 
    $excludedDirs = explode(",",get_option('swmc_image_excl')); // array of subdirectory paths, relative to $directory, to exclude from search 
    $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)); 
    $fileArr = array();  // numerically indexed array with your files 
    $x = -1; 
    while ($it->valid()) 
    { 
        if (!$it->isDot() && !in_array($it->getSubPath(), $excludedDirs) && preg_match('/(\.(jpg|jpeg|gif|png))$/i', $it->key()) == 1) 
        { 
            $fileArr[] = $it->key(); 
        } 
        $it->next(); 
    } 
    
    return $fileArr;
    }  
    

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2013-11-12
      • 2023-03-18
      • 2015-11-24
      • 1970-01-01
      • 2015-03-20
      • 2016-02-18
      • 2012-08-27
      • 2013-01-02
      相关资源
      最近更新 更多