Iterator interface extends abstract Traversable interface. PHP provides many built-in iterators (called SPL iterators) for many routine functionalities. Examples are ArrayIterator, DirectoryIterator etc. A user class that implements Iterator interface should implement abstract methods as defined in it.
Iterator extends Traversable { /* Methods */ abstract public current ( void ) : mixed abstract public key ( void ) : scalar abstract public next ( void ) : void abstract public rewind ( void ) : void abstract public valid ( void ) : bool }
Iterator::current — Return the current element
Iterator::key — Return the key of the current element
Iterator::next — Move forward to next element
Iterator::rewind — Rewind the Iterator to the first element
Iterator::valid — Checks if current position is valid
When implementing IteratorAggregate or Iterator interface which extends Traversable, they must be listed before its name in the implements clause.
In following PHP script, a class that implements Interface contains an array as private variable. Implementing abstract methods of Iterator, we can traverse the array using foreach loop as well with next() method.
<?php class myIterator implements Iterator { private $index = 0; private $arr = array(10,20,30,40); public function __construct() { $this->index = 0; } public function rewind() { $this->index = 0; } public function current() { return $this->arr[$this->index]; } public function key() { return $this->index; } public function next() { ++$this->index; } public function valid() { return isset($this->arr[$this->index]); } } ?>
Using foreach loop, we can iterate over array property of MyIterator object
$it = new myIterator(); foreach($it as $key => $value) { echo "$key=>". $value ."\n"; }
Iteration can also be performed by clling next() method in a while loop. Make sure to rewind the iterator before commencing loop
$it->rewind(); do { echo $it->key() . "=>" .$it->current() . "\n"; $it->next(); } while ($it->valid());
On both occasions, traversal of array property shows following result
0=>10 1=>20 2=>30 3=>40