RegexIterator filters images, ignores a specific directory

:: DECISION::

using @RomanPerekhrest answer with a little modification, I have what I need. This adds several directories to search recursively, as well as to filter specific folders (in my case: "_thumbs"). The final code is below:

$dir1 = new RecursiveDirectoryIterator("./folder01");
$dir2 = new RecursiveDirectoryIterator("./folder02");
$dir3 = new RecursiveDirectoryIterator("./folder03");
$iterators = new AppendIterator();

$filter = function ($file, $key, $iterator) {
    if ($iterator->hasChildren() && $file->getFilename() != "_thumbs") {
        return true;
    }
return $file->isFile();
};

$iterators->append(new RecursiveIteratorIterator( $dir1 ));
$iterators->append( $dir2 );
$iterators->append(new RecursiveIteratorIterator(new RecursiveCallbackFilterIterator($dir3, $filter)));

$rgIt = new RegexIterator($iterators, "/^.+\.jpg$/i");
$files = iterator_to_array($rgIt);

:: Original Question:

RegexIterator. , , RecursiveIteratorIterator. $dir3 , , RecursiveIteratorIterator, "_thumbs" , . RegexIterator .jpg, , "_thumbs" .

$dir1 = new RecursiveDirectoryIterator("./folder01");
$dir2 = new RecursiveDirectoryIterator("./folder02");
$dir3 = new RecursiveDirectoryIterator("./folder03"); // <<< this dir has a _thumbs directory that I don't want to process
$iterators = new AppendIterator();

$iterators->append(new RecursiveIteratorIterator( $dir1 ));
$iterators->append( $dir2 );
$iterators->append(new RecursiveIteratorIterator( $dir3 ));

$rgIt = new RegexIterator($iterators, "/^.+\.jpg$/i");  //<<< this filters and keeps .jpg images.  I don't fully understand the syntax though
$files = iterator_to_array($rgIt);


usort($files, function($a, $b){
    if(filectime($a) == filectime($b)){
        return 0;
    }
    return filectime($a) > filectime($b) ? -1 : 1;
});

$files = array_slice($files, 0 , 18);

:: EDIT01::

, , . RecursiveFilterIterator, , . , , "Argument 1 passed to RecursiveFilterIterator::__construct() must implement interface RecursiveIterator, instance of AppendIterator given".

$dir1 = new RecursiveDirectoryIterator("./folder01");
$dir2 = new RecursiveDirectoryIterator("./folder02");
$dir3 = new RecursiveDirectoryIterator("./folder03");
$iterators = new AppendIterator();

$iterators->append(new RecursiveIteratorIterator( $dir1 ));
$iterators->append( $dir2 );
$iterators->append(new RecursiveIteratorIterator( $dir3 ));

class DirFilter extends RecursiveFilterIterator{
    public function accept(){
        $excludes = "/_thumbs";
        return !(in_array($this->getFilename(), $excludes));
    }
}

$filterItr = new DirFilter($iterators);

$rgIt = new RegexIterator($filterItr, "/^.+\.jpg$/i");
$files = iterator_to_array($rgIt);
+4
1

:

...
$rgIt = new RegexIterator($iterators, "/(?!\/_thumbs\/)^.+\.jpg$/i"); 
$files = iterator_to_array($rgIt);
...

, RecursiveCallbackFilterIterator :

$filter = function ($file, $key, $iterator) {
    if ($iterator->hasChildren() && $file->getFilename() == "_thumbs") {
        return true;
    }
    return $file->isFile();
};
...
$iterators->append( $dir2 );
$iterators->append(new RecursiveIteratorIterator(new RecursiveCallbackFilterIterator($dir3, $filter)));
...
+1

Source: https://habr.com/ru/post/1622321/


All Articles