我正在寻找一个可行的解决方案,在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();
}