3

foreach如果对象 LimitIterator 为空,如何编写不运行以下条件的条件?

$numbers = array(5, 19, 8, 35, 50);

$iterator = new ArrayIterator($numbers);

$limiter = new LimitIterator($iterator, 5, 2);

foreach($limiter as $number)
{
    echo $number.'<br/>';
}

上面的代码返回这个错误,

Fatal error: Uncaught exception 'OutOfBoundsException' with message 'Seek position 5 is out of range' in ..
OutOfBoundsException: Seek position 5 is out of range in..

foreach如果对象 LimitIterator 为空,我只是不想运行。

编辑:

为什么$limiter->valid();总是返回false?我有下面的代码在我网站的一个页面上运行,

$numbers = array(5, 19, 8, 35, 50);

$iterator = new ArrayIterator($numbers);

$limiter = new LimitIterator($iterator, 0, 2);

var_dump($limiter->valid());

if ($limiter->valid()) 
{
    foreach($limiter as $number)
    {
        echo $number.'<br/>';
    }
}
4

2 回答 2

1

当在循环的最开始处试图在倒带后寻找起始偏移量OutOfBoundsException时抛出。LimitIteratorforeach

如果要测试查找位置是否正常,则在块内rewind()或手动进行。seek()try/catch

try {
    $limiter->rewind();
} catch (OutOfBoundsException $e) {
    // Do whatever
}

当然,您可以改为将循环包装在一个blockforeachtry/catch中。


为什么$limiter->valid();总是返回false

它并不总是返回false,只有当它不在有效位置时。

LimitIterator你的脚本中,在调用点上valid(),没有被告知沿着自身或内部迭代器移动。在调用rewind()seek()调用之前,它无法处于有效位置。

于 2011-07-10T23:20:47.567 回答
-1

当然,如果它是空的,那foreach将是一个空操作。

如果您坚持,您可以检查第一个元素是否有效,如 alex 所示:

$limiter->valid()

但这应该是完全没有必要的。

如果这些方法都不适合您,那么还有其他问题。


也许这里真正的问题是您没有检查底层容器实际上是否有七个要迭代的元素。

我不太了解LimitIterator,但我对 C++ 迭代器的经验是,一旦超出了底层容器的合理范围,所有的赌注都将被取消。也许这就是为什么$limiter->valid()对您“不起作用”?

于 2011-07-09T00:15:44.143 回答