當您一邊迭代一邊取消設定元素時,它不會移除正在處理的陣列的第二個索引。我不確定確切原因,但有些推測認為,呼叫 unsetOffset(); 時,它也會重置指標。
<?php
$a = new ArrayObject( range( 0,9 ) );
$b = new ArrayIterator( $a );
for ( $b->rewind(); $b->valid(); $b->next() )
{
echo "#{$b->key()} - {$b->current()} - \r\n";
$b->offsetUnset( $b->key() );
}
?>
為了避免這個錯誤,您可以在 for 迴圈中呼叫 offsetUnset
<?php
/*** ... ***/
for ( $b->rewind(); $b->valid(); $b->offsetUnset( $b->key() ) )
{
/*** ... ***/
?>
或者直接在 ArrayObject 中取消設定
<?php
/*** ... ***/
$a->offsetUnset( $b->key() );
/*** ... ***/
?>
這樣會產生正確的結果