繁体   English   中英

Php,Spl,ArrayIterator

[英]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被调用指针goe到元素0时,offSetUnset等到foreach要求一个元素然后offSetUnset知道它可以行动,所以当它发生时它删除了前面给出的元素,当它完成迭代时它就到了下一个元素,这就是为什么我认为我们在offSetUnset重置foreach循环后丢失0元素。

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

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

$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

如果你愿意,你可以提交一个bug ,但根据我在ArrayIterator看到的其他线程 - 我发现很难相信它会很快被修复...

下面是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 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM