扩展ArrayIterator并修改阵列存储

时间:2012-08-09 23:49:28

标签: php arrayiterator

在扩展ArrayIterator时,如何访问当前数组以进行修改?或从中获取一些其他数据?

请考虑以下示例:     

class Test extends ArrayIterator {
    public function in_array($key) {
        return in_array($key, ???);
    }
}

使用$this->getArrayCopy()代替???吗?这样做有什么更好的解决方案吗?性能怎么样?

如何动态更改类的数组?例如,使用array_walk。

此致

1 个答案:

答案 0 :(得分:2)

请注意ArrayIterator类实现了ArrayAccess。要修改数组,只需将$ this视为数组:

$this['k'] = 'v';

不幸的是,诸如in_array之类的函数不适用于类似数组的对象;你需要一个实际的数组。 getArrayCopy()会有效,但我会使用(array) $this

编辑:正如salathe在评论中指出的那样,getArrayCopy()更好,因为它总是获取内部数组,而(array) $this如果使用STD_PROP_LIST标志则表现不同。

在性能方面,制作像这样的数组的副本确实会导致一个小的减速。作为基准测试,我在一个1000000项的ArrayIterator上尝试了getArrayCopy()(array),并且在我的机器上花了大约0.11秒。另一方面,in_array操作本身(在结果数组上)花了0.011秒 - 大约十分之一。

我也试过这个版本的in_array函数:

class Test extends ArrayIterator {
    public function in_array($key) {
        foreach($this as $v)
            if($v == $key)
                return true;
        return false;
    }
}

当搜索不存在的值时,该函数在我的机器上运行0.07秒,这是该算法的最坏情况。

在大多数情况下,性能问题太小而无关紧要。如果您的情况足够极端,每个数组元素100纳秒左右实际上会有所不同,那么我建议您将要搜索的值放在数组键中并使用offsetExists()代替。