Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php、Spl、ArrayIterator_Php_Spl_Arrayiterator - Fatal编程技术网

Php、Spl、ArrayIterator

Php、Spl、ArrayIterator,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->offSetUn

我试图理解一段代码:

$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 />";
}
$array=array(“考拉”、“袋鼠”、“袋熊”、“袋鼠”、“鸸鹋”、“猕猴桃”、“笑翠鸟”、“鸭嘴兽”);
$object=newarrayiterator($array);
foreach($key=>$value的对象)
{
如果($object->offSetGet($key)=='kiwi')
{
$object->offSetUnset($key);
}
回显$key.'-'.$value.“
”; }
我试图理解的是为什么offSetUnset将指针指向数组中的第二个元素而不是第一个元素,我的理论是以下事件序列:

当offSetUnset被称为指向元素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
如果你愿意,你可以,但是根据我在
ArrayIterator
中看到的关于bug的其他线程,我发现很难相信它会很快被修复…

有一个听起来非常“接近”你发现的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

如果您愿意,您可以,但是根据我在
ArrayIterator
中看到的关于bug的其他线程-我很难相信它会很快得到修复…

这里是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 )

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

谢谢你,阿尔法辛,祝你今天愉快。谢谢你,阿尔法辛,祝你今天愉快。谢谢你,伙计。您的解决方案也解决了我的问题,除了我使用了
ArrayObject
;)thx都德-。您的解决方案也解决了我的问题,除了我使用了
ArrayObject
;)