作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻找一个可行的解决方案,以遍历 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
最佳答案
这不是 Symfony 的“错误”。这是对how to iterate over an object的误解.有几种方法可以为您的用例处理此问题。这里有一些
你的 PersistentCollection
工具 Collection
它实现了 IteratorAggregate
它实现了 Traversable
(路途遥远,嗯?)。
实现接口(interface) Traversable
的对象可以在 foreach
语句中使用。
IteratorAggregate
强制您实现一个方法 getIterator
,该方法必须返回 Iterator
.最后一个还实现了 Traversable
接口(interface)。
Iterator
接口(interface)强制您的对象声明 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();
}
关于php - Symfony2 Doctrine 遍历 while next(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20682636/
我是一名优秀的程序员,十分优秀!