从对象迭代数组

时间:2015-07-26 12:44:24

标签: php arrays object

我想执行一些魔术,以便当我尝试迭代一个对象时,我将实际迭代对象内的一个数组。类似于循环的吸气剂。

class A {
    protected $array = [1,2,3];

    public function __foriteration() {
        return $this->array;
    }
}

$a = new A;

foreach($a as $value) {
   echo $value;
}

// output should be "123"

甚至不确定这是否可行,但我怀疑我应该使用ArrayObject,但对我来说这不是很简单,我无法弄清楚如何做到这一点。

请注意:我可以定义一个getter方法并循环遍历$a->getArray(),但这不是我想要做的。谢谢。

2 个答案:

答案 0 :(得分:1)

您可以实施Iterator interface。为此,您需要在对象中实现几个方法,您可以将这些方法重定向到您的数组:

<?php

class A implements Iterator {
    protected $array = [1,2,3];

    public function __foriteration() {
        return $this->array;
    }

    public function rewind()
    {
        reset($this->array);
    }

    public function current()
    {
        $value = current($this->array);
        return $value;
    }

    public function key() 
    {
        $key = key($this->array);
        return $key;
    }

    public function next() 
    {
        $value = next($this->array);
        return $value;
    }

    public function valid()
    {
        $key = key($this->array);
        return $key !== null && $key !== false;
    }    
}

$a = new A;

foreach($a as $value) {
   echo $value;
}

当然,您可以实现自己的方法来跟踪“当前”项目,但由于数组已经执行了此操作,因此很容易让它为您执行此操作,而rewind之类的方法只需调用数组函数。

答案 1 :(得分:0)

不是编写所有样板文件来使其成为可迭代对象,而是使用生成器:

class A {
    protected $array = [1,2,3];

    public function __foriteration() {
        foreach($this->array as $value) {
            yield $value;
        }
    }
}

$a = new A;

foreach($a->__foriteration() as $value) {
   echo $value;
}