php: всегда теряет элемент # 1 в ArrayIterator с использованием ArrayIterator :: offsetUnset для текущего элемента в цикле

Я всегда теряю второй элемент (# 1) в начале ArrayIterator и удаляю каждый элемент.

$cnt = 0;
$a = new ArrayIterator();
$a->append(++$cnt);
$a->append(++$cnt);
$a->append(++$cnt);
$a->append(++$cnt);
$a->append(++$cnt);

foreach ($a as $i => $item) {
print_r("$i => $item".PHP_EOL);
$a->offsetUnset($i);
}
print_r('count: '.$a->count().PHP_EOL);

foreach ($a as $i => $item) {
print_r("lost! $i => $item".PHP_EOL);
}

Выход:

0 => 1
2 => 3
3 => 4
4 => 5
count: 1
lost! 1 => 2

Как это возможно? оо

$ php -v
PHP 5.5.37 (cli) (built: Jun 22 2016 16:14:46)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies

2

Решение

Поздравляем! Вы нашли задокументированная ошибка в ArrayIterator

Выдержка:

ArrayIterator всегда пропускает второй элемент в массиве при вызове
offsetUnset (); на это, пока проходя.

Использование ключа от итератора и сброс в реальном ArrayObject работает как
ожидается.

1

Другие решения

Кажется, есть только выхлоп ArrayIterator с методом offsetUnset,
Это с помощью do..while:

do {
print_r("{$a->key()} => {$a->current()}".PHP_EOL);
$a->offsetUnset($a->key());
} while ($a->count());
print_r('count: '.$a->count() . PHP_EOL);

Выход:

0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
count: 0
0

По вопросам рекламы [email protected]