object LimitIterator - OutOfBoundsException

时间:2011-07-08 23:25:04

标签: php foreach spl

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

$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..

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

修改

为什么$limiter->valid();始终返回false?我在我的网站上的page上运行了以下代码,

$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/>';
    }
}

2 个答案:

答案 0 :(得分:1)

OutOfBoundsExceptionLimitIterator循环开始时尝试在倒带后寻找起始偏移量时抛出foreach

如果您想测试查找位置是否合适,那么rewind()seek()区域内的try/catch手动{。}}。

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

当然,您可以foreach循环包裹在try/catch中。


  

为什么$limiter->valid();始终返回false

始终不会返回false,只有当它不在有效位置时才会返回LimitIterator

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

答案 1 :(得分:-1)

当然,如果它是空的,foreach将是无操作。

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

$limiter->valid()

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

如果这些方法都不适合你,那么别的东西就错了。


这里真正的问题可能是你检查底层容器实际上有七个要迭代的元素。

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