如果对象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/>';
}
}
答案 0 :(得分:1)
OutOfBoundsException
在LimitIterator
循环开始时尝试在倒带后寻找起始偏移量时抛出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()
对你不起作用的原因?