首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php:使用ArrayIterator::offsetUnset为循环中的当前元素取消设置时,总是丢失ArrayIterator中的第1项

php:使用ArrayIterator::offsetUnset为循环中的当前元素取消设置时,总是丢失ArrayIterator中的第1项
EN

Stack Overflow用户
提问于 2016-07-22 21:00:10
回答 2查看 110关注 0票数 2

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

代码语言:javascript
复制
$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);
}

输出:

代码语言:javascript
复制
0 => 1
2 => 3
3 => 4
4 => 5
count: 1
lost! 1 => 2

这怎么可能呢?oO

代码语言:javascript
复制
$ 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
EN

回答 2

Stack Overflow用户

发布于 2016-07-22 21:16:07

祝贺你!您已找到一个documented bug in ArrayIterator

摘录:

在循环遍历时对数组中的第二个元素调用offsetUnset();时,

ArrayIterator始终跳过该元素。

在实际的ArrayObject中使用来自迭代器的键并取消设置,效果与预期一样。

票数 1
EN

Stack Overflow用户

发布于 2016-07-22 21:12:53

看起来,只有使用offsetUnset方法才能耗尽ArrayIterator。那就是使用do..while

代码语言:javascript
复制
do {
    print_r("{$a->key()} => {$a->current()}".PHP_EOL);
    $a->offsetUnset($a->key());
} while ($a->count());
print_r('count: '.$a->count() . PHP_EOL);

输出:

代码语言:javascript
复制
0 => 1
1 => 2
2 => 3
3 => 4
4 => 5
count: 0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38527123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档