交叉发布原始答案(也在 这个问题中) -
变成glob
迭代器似乎比编写自定义更容易进行预过滤FilterIterator
。另请注意,FilterIterator
在迭代期间仍会逐步执行每个项目,只是忽略它,而 glob 似乎没有。 但是,glob
似乎包含而不是排除,因此可能不适合您的情况。
无前置过滤器:
$dir_iterator = new DirectoryIterator($dir);
$paginated = new LimitIterator($dir_iterator, $page * $perpage, $perpage);
全局预过滤器:
$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
example 只是磁盘路径。
示例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);