我正在寻找工作解决方案,以迭代mongodb中的symfony2 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
答案 0 :(得分:8)
这不是Symfony的“错误”。这是对how to iterate over an object的误解。有几种方法可以为您的用例处理此问题。这是一些
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();
}