Symfony2 Doctrine迭代,而next()

时间:2013-12-19 13:09:12

标签: php mongodb loops symfony doctrine-orm

我正在寻找工作解决方案,以迭代中的 PersistentCollection。不幸的是,这似乎不起作用? Symfony忽略 next()函数!

while (($animal = $zooAnimals->next()) !== false) {

    $color = $animal->getColor();

    print_r($color); die; // Test and die
}

print_r('Where are the animals?'); die; // << Current result

参考:Doctrine\ODM\MongoDB\PersistentCollection

4 个答案:

答案 0 :(得分:8)

这不是Symfony的“错误”。这是对how to iterate over an object的误解。有几种方法可以为您的用例处理此问题。这是一些

使用foreach!

PersistentCollection实施Collection实施IteratorAggregate实施Traversable (长路嘿嘿?)
实现接口Traversable的对象可以在 foreach 语句中使用。

IteratorAggregate强制您实施一个必须返回Iterator的方法getIterator。最后还实现了Traversable接口。

迭代器的用法

Iterator界面强制您的对象声明5个方法,以供foreach

使用
class MyCollection implements Iterator
{
    protected $parameters = array();
    protected $pointer = 0;

    public function add($parameter)
    {
        $this->parameters[] = $parameter;
    }

    /**
     * These methods are needed by Iterator
     */
    public function current()
    {
        return $this->parameters[$this->pointer];
    }

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

    public function next()
    {
        $this->pointer++;
    }

    public function rewind()
    {
        $this->pointer = 0;
    }

    public function valid()
    {
        return array_key_exists($this->pointer, $this->parameters);
    }
}

你可以使用任何实现Iterator的类 - Demo file

$coll = new MyCollection;
$coll->add('foo');
$coll->add('bar');

foreach ($coll as $key => $parameter) {
    echo $key, ' => ', $parameter, PHP_EOL;
}

使用迭代器一会儿

为了使用这个类喜欢一个foreach。应该以这种方式调用方法 - Demo file

$coll->rewind();

while ($coll->valid()) {
    echo $coll->key(), ' => ', $coll->current(), PHP_EOL;
    $coll->next();
}

答案 1 :(得分:3)

简单解决方案:

1 首先将 PersistentCollection 转换为数组

$zooAnimalsArray = $zooAnimals->toArray();

2 像任何PHP数组一样处理数组。

注意 这样做的好处是创建的代码不会过多地依赖于您的数据库(如果您希望有一天切换到关系数据库),那么您就不会必须重写一切。

答案 2 :(得分:2)

对我有用!

$collection = new ArrayCollection();
$collection->add('Laranja');
$collection->add('Uva');
$collection->add('Morango');

do {
    print_r($collection->current());
} while ($collection->next());

答案 3 :(得分:0)

这是我的解决方法,

$zooAnimals->getIterator();

while ($animal = $zooAnimals->current()) {

    echo $animal->getColor();

    $zooAnimals->next();
}