我有下面的功能。它遍历目录并递归搜索它们以获取随机图像文件,然后将其附加到帖子中。我想要做的是从搜索中排除一些文件。
我有一个逗号分隔的列表,我将其分解为一个数组,我尝试使用过滤器但无法使其正常工作。
当前没有过滤器的功能是
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 循环中跳过它们来手动过滤掉它们,但是这仍然会检查它们并浪费内存和时间。如果可能的话,我宁愿在抓取时跳过这些。