Symfony2 Doctrine iterate over with while next()



我正在寻找一个可行的解决方案,在symfony2中迭代mongodb 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

这不是

Symfony的"错"。这是对如何迭代对象的误解。有几种方法可以为您的用例处理此问题。这里有一些

使用一个foreach!

你的PersistentCollection实现了Collection实现了IteratorAggregate实现了Traversable(路漫漫其修路
实现接口Traversable的对象可以在 foreach 语句中使用。

IteratorAggregate强制您实现一个方法getIterator该方法必须返回Iterator。最后一个也实现了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它的类 - 演示文件

$coll = new MyCollection;
$coll->add('foo');
$coll->add('bar');
foreach ($coll as $key => $parameter) {
    echo $key, ' => ', $parameter, PHP_EOL;
}

使用迭代器一段时间

为了像使用foreach一样使用这个类。方法应该这样调用 - 演示文件

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

简单的解决方案:

1 首先将持久集合转换为数组

$zooAnimalsArray = $zooAnimals->toArray();

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

注意这样做的好处是创建的代码不太依赖于数据库(如果您希望有一天切换到关系数据库),则不必重写所有内容。

我有用!

$collection = new ArrayCollection();
$collection->add('Laranja');
$collection->add('Uva');
$collection->add('Morango');
do {
    print_r($collection->current());
} while ($collection->next());
这是我

的解决方案,

$zooAnimals->getIterator();
while ($animal = $zooAnimals->current()) {
    echo $animal->getColor();
    $zooAnimals->next();
}

相关内容

  • 没有找到相关文章

最新更新