php:始终在ArrayIterator中丢失项#1,并对循环中的当前元素使用ArrayIterator::offsetUnset

php:始终在ArrayIterator中丢失项#1,并对循环中的当前元素使用ArrayIterator::offsetUnset,php,arrayiterator,Php,Arrayiterator,我总是在ArrayIterator前面丢失第二项(#1)并删除每个元素 $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".

我总是在ArrayIterator前面丢失第二项(#1)并删除每个元素

$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
0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
count: 0
这怎么可能?哦

$ 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

似乎,只有使用方法
offsetUnset
才能耗尽
ArrayIterator
。 这是在使用
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
2 => 3
3 => 4
4 => 5
count: 1
lost! 1 => 2
0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
count: 0

恭喜你!你找到了一个

摘录:

ArrayIterator在调用时总是跳过数组中的第二个元素 offsetUnset();在它上面循环

使用迭代器中的键并在实际ArrayObject中取消设置 预料之中


谢谢你发现了这个错误。我不知道这件事。