2011-07-08 29 views
3

如果对象LimitIterator为空,我该如何编写一个条件,以便在下面不运行foreach对象LimitIterator - OutOfBoundsException

$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?下面我有在我的网站上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/>'; 
    } 
} 
+1

请停止撰写标签和谢谢..我发现,如果不是你所有的184个问题,你一直在这么做;( –

+0

这里是不是要谢谢的规则 – laukok

+0

是的,SO不是一个论坛或聊天,但一个_knowledge resource_;你在问题中看到的唯一一件事应该是一个问题,通过投票和回答问题回馈社区是充足的谢意,你不会在字典中看到“谢谢” –

回答

1

OutOfBoundsException被抛出时,LimitIterator试图寻求复卷后的起始偏移量,在foreach循环的开始。

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

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

当然,你可以改为换你01​​循环在try/catch


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

它并不总是回报false,只有当它是不是一个有效的当前位置。

脚本中的LimitIterator在调用valid()的位置时,并没有被告知沿着它自身或内部迭代器的任何位置移动。直到rewind()seek()被调用,它才有可能处于有效位置。

+0

我可以看到[你是权威](https://bugs.php.net/bug.php?id=53926),所以你能解释为什么它不会像常规的' foreach'循环?这种破坏与分页有关的功能。 – drzaus

-1

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

如果你坚持,你可以检查的第一个元素是有效的,因为亚历克斯证实:

$limiter->valid() 

,但是这应该是完全不必要的。

如果这两种方法都不适用于您,那么其他方面就是错误的。


也许这里真正的问题是,你是不是检查的基础容器居然有七个要素进行迭代。

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

+0

它总是返回如果你使用'var_dump()'来测试''boolean false''例如:'var_dump($ limiter-> valid());' – laukok

+0

@lauthiamkok:它并不总是返回false,仅当“current元素“无效。[Here](http://www.php.net/manual/en/limititerator.valid.php)的文档。 –

+0

请看我上面的编辑 - 你能解释为什么我会得到'false '? – laukok