2016-07-22 6 views
2

ArrayIteratorのforearhで常に2番目の項目(#1)を失い、各要素を削除しています。php:ArrayIterator :: offsetUnsetを使用して常にループ内の現在の要素にアイテム#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 

?オブジェクト指向

$ 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 

答えて

0

方法offsetUnsetArrayIteratorを排出するだけである、と思われます。 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 
1

おめでとうを!あなたはdocumented bug in ArrayIterator

エキスを発見した: offsetUnset()を呼び出すとき

ArrayIteratorは常に配列の2番目の要素をスキップします。それをループしている間に。

イテレータのキーを使用し、実際のArrayObjectで設定を解除すると、 と予想されます。

+0

よく、このバグを発見してくれてありがとう。私はそれについて知らなかった。 – Kirby

関連する問題