【问题标题】:object LimitIterator - OutOfBoundsException对象 LimitIterator - OutOfBoundsException
【发布时间】:2011-10-01 16:11:01
【问题描述】:

如果对象 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-&gt;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/>';
    }
}

【问题讨论】:

  • 请停止写标签,谢谢.. 我看到你已经为你的 184 个问题做了大部分,如果不是全部的话;(
  • 这里的规则是不感谢吗??
  • 是的。 SO 不是论坛或聊天,而是知识资源;您在问题中看到的唯一内容应该是问题。非常感谢通过投票和回答问题回馈社区。您不会在字典中看到“谢谢”。

标签: php foreach spl


【解决方案1】:

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

如果你坚持,你可以检查第一个元素是否有效,正如 alex 演示的那样:

$limiter->valid()

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

如果这两种方法都不适合你,那么还有其他问题。


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

可以肯定的是,我对LimitIterator 的了解还不够,但是我对 C++ 迭代器的经验是,一旦超出了底层容器的合理范围,所有的赌注都将失败。也许这就是为什么$limiter-&gt;valid() 对你“不起作用”?

【讨论】:

  • 如果您使用var_dump() 测试它,它总是返回boolean false 例如:var_dump($limiter-&gt;valid());
  • @lauthiamkok:它并不总是返回 false。仅当“当前元素”无效时才返回falseHere 的文档。
  • 请看我上面的编辑 - 你能解释我为什么得到false吗?
  • @lauthiamkok: (live example) 嗯,没有。正在调查。
  • @lauthiamkok:This 很有趣。我从the documentation 中获取了示例,它有效,并且只添加了对-&gt;valid() 的引用,它返回false。我只能假设-&gt;valid() 要么坏了,要么没有做我们认为它做的事情。
【解决方案2】:

LimitIterator 试图在倒带后寻找起始偏移量时,OutOfBoundsException 被抛出,在 foreach 循环的最开始。

如果您想测试查找位置是否正常,请在 try/catch 块内使用 rewind() 或手动 seek()

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

当然,您可以改为foreach 循环包装在try/catch 块中


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

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

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

【讨论】:

  • 我可以看到you're the authority,那么你能解释一下为什么它不像普通的foreach 循环那样在最后停止迭代吗?这种破坏了分页的功能。
猜你喜欢
  • 1970-01-01
  • 2012-07-16
  • 2015-09-05
  • 1970-01-01
  • 2015-09-08
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
相关资源
最近更新 更多