扩展阵列迭代器和修改阵列存储


Extending ArrayIterator and modifying array storage

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

请考虑以下示例:

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

使用$this->getArrayCopy()而不是???可以吗?有没有更好的解决方案?性能如何?

以及如何动态更改类数组?例如使用array_walk。

问候

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

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

不幸的是,像in_array这样的函数不适用于类似数组的对象;你需要一个实际的数组。 getArrayCopy()会起作用,但我只会使用(array) $this.

编辑:正如salathe在评论中指出的那样,getArrayCopy()更好,因为它总是得到内部数组,而如果你使用STD_PROP_LIST标志,(array) $this的行为会有所不同。

在性能方面,制作这样的数组副本确实会导致小幅减速。 作为基准测试,我在包含 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()