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 I could make my object behave like an array?
For instance, let's say I have a class Guestbook
which implements Iterator
, so that I can iterate foreach (new Guestbook() as $entry)
. But what if I want to, say, reverse the order?
foreach (array_reverse(new Guestbook()) as $entry)
definitely won't work, because array_reverse
will only accept an array.
I guess what I'm asking is, can I use Iterator
for more than just foreach
loops?
Thanks.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With