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, ...

Get Upgrading to PHP 5 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.