3

foreachオブジェクト LimitIterator が空の場合、以下を実行しない条件をどのように記述できますか?

$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ですか? 私は自分のサイトのページで以下のコードを実行しています。

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

2 に答える 2

1

が巻き戻し後にループの最初で開始オフセットをシークしようとすると、OutOfBoundsExceptionがスローされます。LimitIteratorforeach

シーク位置が問題ないかどうかをテストする場合は、ブロック内でrewind()または手動で行います。seek()try/catch

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

もちろん、代わりにループをblockでラップするforeachtry/catchこともできます。


$limiter->valid();が常に を返すのはなぜfalseですか?

有効な位置にない場合にのみ、常に を返すとは限りません。false

LimitIteratorを呼び出す時点で、スクリプト内の は、それvalid()自体にも内部イテレータにも移動するように指示されていません。rewind()またはseek()が呼び出されるまで、有効な位置にある方法はありません。

于 2011-07-10T23:20:47.567 に答える