1

我试图理解一段代码:

$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 知道它可以行动,所以当它发生时,它会删除之前给定的元素,当它完成迭代时,它会转到下一个元素,这就是为什么我认为在 offSetUnset 重置 foreach 循环后我们会丢失 0 元素。

但正如我所说,这只是我在问这里之前提出的一个理论,所以如果有人可以带我通过事件序列让我们失去 0 元素,谢谢大家,祝你有美好的一天。

4

2 回答 2

2

有一个记录在案的错误听起来与您发现的错误非常“接近”!
为了解决它,您可以执行以下操作:

$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

如果你愿意,你可以提交一个错误,但根据我看到的关于错误的其他线程ArrayIterator- 我很难相信它会很快得到修复......

于 2012-09-13T18:08:23.150 回答
2

这是 offsetUnset 的用法,其中元素按其索引取消设置并给出预期结果:

$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 )
于 2017-03-02T11:47:11.840 回答