Chaining Iterators
An important iterator feature is the ability to chain them together so they can act as a series of filters. For example, you can use iterators to restrict results to words that match a particular regular expression or to return only the first 10 results.
I
call these types of iterators meta-iterators. SPL comes with two
meta-iterators: FilterIterator, to filter results,
and LimitIterator, to limit results.
Filtering Results with FilterIterator
FilterIterator
is an abstract class
that implements all the methods of a regular
Iterator. However, it has a twist—you must
define an
accept( ) method that
controls whether an item should be returned or filtered out from the
results.
Unlike DirectoryIterator, which is directly
instantiable, you cannot create a new
FilterIterator. Instead, you must
extend it and implement accept( ).
Here’s an example that filters by a Perl-compatible regular expression:
class RegexFilter extends FilterIterator {
protected $regex;
public function _ _construct(Iterator $it, $regex) {
parent::_ _construct($it);
$this->regex = $regex;
}
public function accept( ) {
return preg_match($this->regex, $this->current( ));
}
}
RegexFilter takes two arguments in its
constructor: an Iterator to filter and a regular
expression pattern to use as a filter. The first parameter is passed
on to the parent FilterIterator constructor,
because it handles the iteration for your class.
The regular expression (regex for short) is stored in a
protected property, ...