2011-07-08 39 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