Цель интерфейса Iterator заключается в том, чтобы ваш объект использовался в цикле foreach, он не предназначен для того, чтобы ваш объект действовал как массив. Если вы хотите что-то, что действует как массив, используйте массив.
Вы всегда можете превратить свой объект в массив с помощью функции iterator_to_array , но вы не можете отменить этот процесс.
Если вы видите необходимость для изменения порядка элементов в вашем итерируемом объекте, вы можете создать метод reverse (), который, возможно, использует array_reverse () внутри. Что-то вроде этого: -
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));
Выход: -
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
Я написал код, чтобы доказать себе, что он будет работать до публикации, и подумал, что я мог бы его бросить в ответ.