2012-09-13 36 views
1

我想了解一段代碼:PHP,SPL,ArrayIterator

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus'); 
$object = new ArrayIterator($array); 
foreach($object as $key=>$value) 
{ 
if($object->offSetGet($key) === 'kiwi') 
{ 
$object->offSetUnset($key); 
} 
echo $key.' - '.$value."<br />"; 
} 

什麼,我想明白的是爲什麼offSetUnset走的是指針的第二個元素的數組,而不是到第一個,我的理論是事件的順序如下:

當offSetUnset被稱爲指針專家組對元素0, 的offSetUnset等到的foreach要求的元素則offSetUnset 知道它可以採取行動,所以,當它發生了,它刪除了給定的元素arlier,當它完成迭代時,它轉到下一個元素,這就是爲什麼我認爲我們在offSetUnset重置foreach循環後丟失了0元素。

但是正如我所說的那樣,在我問到這裏之前只有一個理論,所以如果有人能通過事件序列帶我請我們失去0元素,謝謝大家,祝你有美好的一天。

回答

2

有一個documented bug這聽起來非常「接近」你找到的錯誤!
爲了工作,圍繞它,你可以做如下:

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus'); 
$object = new ArrayIterator($array); 
for ($object->rewind(); $object->valid(); $object->next()) 
{ 
    if($object->current() === 'kiwi') 
    { 
     $object->offsetUnset($object->key()); 
    } 
    echo $object->key().' - '.$object->offsetGet($object->key())."\n"; 
} 

輸出:

0 - koala 
1 - kangaroo 
2 - wombat 
3 - wallaby 
4 - emu 
0 - koala (this time it starts over from the first element!) 
1 - kangaroo 
2 - wombat 
3 - wallaby 
4 - emu 
6 - kookaburra 
7 - platypus 

如果你願意,你可以submit a bug,但根據其他線程我看到有關錯誤ArrayIterator - 我發現很難相信它會很快被修復...

+0

謝謝Alfasin,有一個愉快的一天。 –

1

這裏是使用offsetUnset where元素S被他們的指標,給出預期的結果,取消設置:

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus'); 

$object = new \ArrayIterator($array); 

foreach ($object->getArrayCopy() as $i => $item) { 
    if($item === 'kiwi') { 
     $object->offsetUnset($i); 
    } 
} 

print_r($object->getArrayCopy()); 

輸出:

Array ([0] => koala [1] => kangaroo [2] => wombat [3] => wallaby [4] => emu [6] => kookaburra [7] => platypus)