2

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

请考虑以下示例:

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

是使用$this->getArrayCopy()而不是???好吗?有没有更好的解决方案来做到这一点?性能呢?

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

问候,

4

1 回答 1

2

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

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

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

编辑:作为评论中的 salathe 注释,getArrayCopy()更好,因为它总是获取内部数组,而(array) $this如果您使用STD_PROP_LIST标志,则行为会有所不同。

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

我也试过这个版本的in_array功能:

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

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

The performance problems are too small to matter in most cases. If your situation is extreme enough that 100 nanoseconds or so per array element actually make a difference, then I would suggest putting the values you want to search for in the array keys and using offsetExists() instead.

于 2013-05-02T21:35:01.493 回答