доступ к значению next () и rewind () в итераторе PHP, выполняемом в цикле foreach - PullRequest
0 голосов
/ 31 августа 2010

Увидел это в википедии, вот что происходит, когда вы пересекаете итератор через цикл foreach:

Все эти методы используются в полный foreach ($ объект как $ key => $ value) последовательность. Методы выполняются в следующем порядке:

rewind() 
while valid() {
    current() in $value 
    key() in $key 
    next()
} 
End of Loop

Мне было интересно, как я могу получить доступ к значениям next () и rewind (). Есть идеи?

ОБНОВЛЕНИЕ : доступ к ним из цикла foreach

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

Что вы думаете об этом?

for ($i =0; $i < count($arr); $i++) {

    $last = ($i == 0) ? null : $arr[$i-1];
    $next = (isset($arr[$i+1]) ? $arr[$i+1] : null;
    $current = $arr[$i];

    //...

}
1 голос
/ 31 августа 2010

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

Итак, самым близким (PHP 5.3) будет:

label:
foreach ($var as $k => $v) {

    /* ... */
    goto label; //re-enter loop

    /* ... */
    continue; //force going to the next iteration

    /* ... */
}

Если вы используете итераторы напрямую, вы можете использовать эти вызовы:

$r = 0; $s = 0;
$it = new ArrayIterator(array("a" => 3, "b" => 5, "c" => 7));
foreach ($it as $k => $v) {
    echo "$k => $v\n";
    if ($s == 0) {
        $s = 1;
        $it->next(); //jump over one iteration
    } else if ($r == 0) {
        $r = 1;
        $it->rewind();
    }
}

дает:

a => 3
c => 7
b => 5
c => 7
0 голосов
/ 31 августа 2010

ЕСЛИ реализует интерфейс Iterator, вы можете вызывать эти методы самостоятельно, но они имеют значение.

rewind и next оба устанавливают положение указателя в наборе данных, который повторяется ... они фактически не возвращают элемент или индекс.Таким образом, вызов любого из них может испортить ваш цикл.

current вернет ту же переменную, что у вас уже есть в цикле - т.е.элемент для текущей итерации.key вернет индекс для этого элемента в наборе.

...