私は以下の機能を持っています。ディレクトリを通過し、それらを再帰的に検索してランダムな画像ファイルを取得し、それを投稿に添付します。私がやりたいことは、検索からいくつかのファイルを除外することです。
配列に展開するカンマ区切りのリストがあります。フィルターを使用しようとしましたが、これを機能させることができませんでした。
フィルタなしの現在の関数は
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 をディレクトリとして除外したいかもしれませんが、タイトルに 2011 が含まれる 2009 年の画像は除外したくありません。
説明:
foreach ループでこれらをスキップして手動で除外することもできますが、それでもチェックが行われ、メモリと時間が浪費されます。可能であれば、グラブ時にこれらをスキップしたいと思います。