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

Php 扩展阵列迭代器和修改阵列存储,php,arrayiterator,Php,Arrayiterator,在扩展ArrayInterator时,如何访问当前阵列以修改它?或者从中获取其他数据 请考虑下面的例子: 是否正在使用$this->getArrayCopy()而不是?确定?有没有更好的解决办法?性能如何 如何动态地改变类的数组?例如,使用数组_walk 关于,请注意,ArrayIterator类实现了ArrayAccess。要修改数组,只需将$this视为数组: $this['k'] = 'v'; 不幸的是,像_array中的这样的函数在类似数组的对象上不起作用;你需要一个实际的数组get

在扩展ArrayInterator时,如何访问当前阵列以修改它?或者从中获取其他数据

请考虑下面的例子:

是否正在使用
$this->getArrayCopy()
而不是
确定?有没有更好的解决办法?性能如何

如何动态地改变类的数组?例如,使用数组_walk


关于,

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

$this['k'] = 'v';
不幸的是,像_array中的
这样的函数在类似数组的对象上不起作用;你需要一个实际的数组
getArrayCopy()
可以工作,但我只使用
(array)$this

编辑:与注释中的注释一样,
getArrayCopy()
更好,因为它总是获取内部数组,而
(array)$this
在使用
STD\u PROP\u LIST
标志时会有不同的行为

就性能而言,制作这样的阵列副本确实会导致一点速度减慢。作为基准测试,我在一个包含1000000个项目的ArrayInterator上尝试了
getArrayCopy()
(array)
,这两种方法在我的机器上都花费了大约0.11秒。另一方面,
in_数组
操作本身(在生成的数组上)耗时0.011秒,约为10秒

我还尝试了这个版本的
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()

“使用
(数组)$this
。它们做同样的事情。”-不一定,这种行为取决于所使用的标志
ArrayIterator::STD_PROP_LIST
将导致
(array)$this
不是存储数组的表示形式;您可以猜测
ArrayIterator::ARRAY\u作为_道具将做什么。:)我加了一条注释,大意是这样的
ARRAY\u AS_PROPS
似乎不会改变
(ARRAY)$this
的行为或性能,所以我忽略了这一点。
class Test extends ArrayIterator {
    public function in_array($key) {
        foreach($this as $v)
            if($v == $key)
                return true;
        return false;
    }
}