объект LimitIterator - OutOfBoundsException - PullRequest
3 голосов
/ 09 июля 2011

Как мне написать условие, чтобы не запускать 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/>';
    }
}

Ответы [ 2 ]

1 голос
/ 11 июля 2011

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(), он не может быть в допустимой позиции.

0 голосов
/ 09 июля 2011

Конечно, если он пуст, foreach будет неактивным.

Если вы настаиваете, вы можете проверить, что первый элемент действителен, как продемонстрировал Алекс:

$limiter->valid()

но это должно быть совершенно ненужно.

Если ни один из этих подходов не "работает" для вас, значит, что-то еще не так.


Возможно, настоящая проблема здесь в том, что вы не проверяют, что базовый контейнер на самом деле имеет семь элементов для итерации.

Я не знаю достаточно о LimitIterator, чтобы быть уверенным, но мой опыт работы с итераторами C ++ заключается в том, что как только вывыходить за разумные границы основного контейнера, все ставки сняты.Возможно, именно поэтому $limiter->valid() "не работает" для вас?

...