ArrayIterator的valid()始终显示为true

时间:2016-07-27 13:18:20

标签: php doctrine-orm

我遇到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

1 个答案:

答案 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会在迭代后重置迭代器)

: - )