将实现Iterator的PHP类视为一个数组

M M*_*ler 6 php arrays foreach iterator

如果我有一个实现Iterator接口的类,我可以手动控制循环中的迭代方式foreach.但是有没有其他方法可以让我的对象像数组一样?

例如,假设我有一个Guestbook实现的类Iterator,以便我可以迭代foreach (new Guestbook() as $entry).但是,如果我想要反转订单呢?

foreach (array_reverse(new Guestbook()) as $entry)绝对不会工作,因为array_reverse只会接受一个数组.

我想我要问的是,我可以使用Iterator的不仅仅是foreach循环吗?

谢谢.

vas*_*ite 18

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));
Run Code Online (Sandbox Code Playgroud)

输出: -

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
Run Code Online (Sandbox Code Playgroud)

我编写了代码来向自己证明它在发布之前会起作用,并且我认为我可能会把它放到答案中.