gpt4 book ai didi

php - Symfony2 Doctrine 遍历 while next()

转载 作者:可可西里 更新时间:2023-11-01 09:56:28 25 4
gpt4 key购买 nike

我正在寻找一个可行的解决方案,以遍历 中的 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 的“错误”。这是对how to iterate over an object的误解.有几种方法可以为您的用例处理此问题。这里有一些

使用foreach!

你的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com