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