If I have a class that implements the Iterator
interface, I can manually control how iteration in a foreach
loop. But are there other ways in which
From PHP
Introduction
Interface for external iterators or objects that can be iterated themselves internally.
As you can see from the interface Table of Contents ¶
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
The operation is designed for forward iteration. So reverse would naturally not work and is not designed for this.
For more array-object related interfaces take a look at. ArrayAccess and Countable
For a solution upon a reverse object iterator take a look at the answer here Iterate in reverse through an array with PHP - SPL solution?
The purpose of the Iterator interface is to allow your object to be used in a foreach loop, it is not intended to make your object act like an array. If you want something that acts like an array, use an array.
You can always turn your object into an array by using the iterator_to_array function, but you can't reverse that process.
If you see the need for reversing the order of the elements in your iterable object, then you could create a reverse() method that, possibly, uses array_reverse() internally. Something like this:-
class Test implements Iterator
{
private $testing = [0,1,2,3,4,5,6,7,8,9,10];
private $index = 0;
public function current()
{
return $this->testing[$this->index];
}
public function next()
{
$this->index ++;
}
public function key()
{
return $this->index;
}
public function valid()
{
return isset($this->testing[$this->key()]);
}
public function rewind()
{
$this->index = 0;
}
public function reverse()
{
$this->testing = array_reverse($this->testing);
$this->rewind();
}
}
$tests = new Test();
var_dump(iterator_to_array($tests));
$tests->reverse();
var_dump(iterator_to_array($tests));
Output:-
array (size=11)
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
6 => int 6
7 => int 7
8 => int 8
9 => int 9
10 => int 10
array (size=11)
0 => int 10
1 => int 9
2 => int 8
3 => int 7
4 => int 6
5 => int 5
6 => int 4
7 => int 3
8 => int 2
9 => int 1
10 => int 0
I wrote the code to prove to myself that it would work before posting and thought I might as well throw it into the answer.
Implement ArrayAccess
in your class.
See the documentation here: http://www.php.net/arrayaccess