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
;)