Php ArrayObject不';我不允许在迭代时取消设置值

Php ArrayObject不';我不允许在迭代时取消设置值,php,spl,arrayobject,Php,Spl,Arrayobject,我收到这个通知: ArrayIterator::next():数组在对象外部修改,内部位置在/var/www中不再有效 这是在foreach循环开始时由该代码生成的。与通知一起,foreach循环再次开始迭代。换句话说,每当发生这种情况时,内部位置就会重置。但根据php手册,ArrayObject默认使用ArrayIterator 手册上说的是ArrayIterator 此迭代器允许在迭代数组和对象时取消设置和修改值和键 我是不是遗漏了什么?我发现了一些关于ArratIterator的错误报告,

我收到这个通知:

ArrayIterator::next():数组在对象外部修改,内部位置在/var/www中不再有效

这是在foreach循环开始时由该代码生成的。与通知一起,foreach循环再次开始迭代。换句话说,每当发生这种情况时,内部位置就会重置。但根据php手册,ArrayObject默认使用ArrayIterator

手册上说的是ArrayIterator

此迭代器允许在迭代数组和对象时取消设置和修改值和键

我是不是遗漏了什么?我发现了一些关于ArratIterator的错误报告,但不是这种。是虫子还是我的错

版本:PHP版本5.3.10-1ubuntu3.4


实现,这意味着它有一个名为的方法,该方法返回迭代器

php的foreach循环将通过调用getIterator()方法自动检索迭代器,以便检索要迭代的迭代器。这很方便,但是您需要获取对该迭代器的引用,以便在迭代器本身上调用该方法。这里的关键是必须调用迭代器offsetUnset()方法,而不是ArrayObjects的offsetUnset()方法

迭代器正在迭代的基础ArrayObject将发生变化,因此,如果在同一ArrayObject上同时有多个活动迭代器,则仍然会遇到相同的错误


其基本原理可能是迭代器可以节省内存,而不必复制底层的ArrayObject,因为拷贝是处理在向基础数组添加或从中删除内容时确定当前迭代器位置的复杂性的唯一简单解决方案。

如果从数组中删除最后一条记录,则下一个foreach循环可能会失败(内部调用$this->next()) 例如,当我有一个项目的数组,我将取消它,比下一个foreach失败

因此,它帮助我测试了有效性,并在本例中中断了下一个循环

deleteOffset = true;

foreach ($iterator as $key => $value)
    {
            if ($deleteOffset && $iterator->offsetExists($key) ) 
            {
                 $iterator->offsetUnset($key);                                       
            }                

        //if remove last record than the foreach ( $this->next() ) fails so 
        //we have to break in this case the next ->next call
        //after any ->offsetUnset calls

        if (!$iterator->valid()) break;

    }

这花了我很长时间!我使用此页面上的配方(未成功)清除ArrayObject存储的内容,然后我发现了这个小玩意儿

$this->exchangeArray(array());

魔法

我明白了,它真的很管用。但这有点奇怪。我希望ArrayObject自动调用迭代器的方法。谢谢!这让我恼火了一段时间,建立了一个特定的if语句来处理它,但这解决了它
deleteOffset = true;

foreach ($iterator as $key => $value)
    {
            if ($deleteOffset && $iterator->offsetExists($key) ) 
            {
                 $iterator->offsetUnset($key);                                       
            }                

        //if remove last record than the foreach ( $this->next() ) fails so 
        //we have to break in this case the next ->next call
        //after any ->offsetUnset calls

        if (!$iterator->valid()) break;

    }
$this->exchangeArray(array());