Кросс-постинг оригинальный ответ ( также в этот вопрос ) -
Превращение glob
в итератор кажется более простым, чем написание пользовательского FilterIterator
. Также обратите внимание, что FilterIterator
все еще проходит через каждый элемент во время итерации, просто игнорирует его, тогда как glob, похоже, этого не делает. Однако , glob
скорее включает, а не исключает, поэтому может не соответствовать вашему сценарию.
Без предварительного фильтра:
$dir_iterator = new DirectoryIterator($dir);
$paginated = new LimitIterator($dir_iterator, $page * $perpage, $perpage);
Предварительный фильтр Glob:
$dir_glob = $dir . '/*.{jpg,gif,png}';
$dir_iterator = new ArrayObject(glob($dir_glob, GLOB_BRACE)); // need to get iterator
$dir_iterator = $dir_iterator->getIterator();
$paginated = new LimitIterator($dir_iterator, $page * $perpage, $perpage);
Тогда делай свое дело:
foreach ($paginated as $file) { ... }
Обратите внимание, что в случае DirectoryIterator
, $file
будет экземпляром SplFileInfo
, тогда как glob
- это просто путь к диску.
Пример FilterIterator
расширение
class ExtensionFilterIterator extends FilterIterator {
private $filter;
public function __construct(Iterator $iterator , $filter) {
parent::__construct($iterator);
$this->filter = $filter;
}
// the meat and potatoes
public function accept() {
$current = $this->getInnerIterator()->current();
### global $counter;
### print_r(array($counter++, $current)); // this proves it goes through the whole thing, even with limit
// do your comparison
// assume path
if( is_string($current) ) {
$extension = end( explode('.', $current) );
}
// assume DirectoryIterator
else {
// $ext = $fileinfo->getExtension(); // http://www.php.net/manual/en/class.splfileinfo.php
$extension = pathinfo($current->getFilename(), PATHINFO_EXTENSION); // < PHP 5.3.6 -- http://www.php.net/manual/en/splfileinfo.getextension.php
}
return ! in_array($extension,$this->filter);
}
}
Использование:
$dir_iterator = new ExtensionFilterIterator(new DirectoryIterator($dir), array('gif', 'jpg', 'png'));
$paginated = new LimitIterator($dir_iterator, $page * $perpage, $perpage);