我遇到ArrayIterator::valid()
方法的问题。它总是回归真实。我不知道我是否理解它应该如何运作,或者我做错了什么......
我使用了Doctrine的Paginator
http://www.doctrine-project.org/api/orm/2.1/source-class-Doctrine.ORM.Tools.Pagination.Paginator.html
它确实实现了\Countable
和\IteratorAggregate
。方法getIterator()
返回\ArrayIterator
。
我认为:
<?php foreach ($this->paginator as $message): ?>
<?php var_dump($this->paginator->valid()); ?> // Fatal error. Method does not exist
<?php var_dump($this->paginator->getIterator()->valid()); ?> // <-- it always return true
<p>Teeeeeest</p>
<?php endforeach; ?>
我也尝试过:
<?php $paginator = $this->paginator->getIterator(); ?>
<?php foreach ($paginator as $message): ?>
<?php var_dump($paginator->valid()); ?> // <-- it always return true
<p>Teeeeeest</p>
<?php endforeach; ?>
var_dump($this->paginator)
表示我有2条记录。所以我应该在第一次迭代中获得true
并在第二次迭代中获得false
。我对么?那么为什么它总是返回true
答案 0 :(得分:1)
foreach只接受有效的条目,因此此时$paginator->valid()
始终有效。如果您使用的$paginator->next()
将在最后一个条目被执行后以false
结尾。
所以$paginator->valid()
与$paginator->next()
一起用于foreach
尝试像那样测试它。
$paginator->reset();
while($paginator->valid()){
$entrie = $paginator->current();
$paginator->next();
}
或在 foreach之后使用var_dump($paginator->valid());
进行测试。 (但也许foreach会在迭代后重置迭代器)
: - )