扩展ArrayIterator时,如何访问当前数组进行修改?或者从中获取一些其他数据?
请考虑下面的示例:
class Test extends ArrayIterator {
public function in_array($key) {
return in_array($key, ???);
}
}用???代替$this->getArrayCopy()可以吗?有没有更好的解决方案呢?性能如何?
以及如何动态更改类的数组?例如,使用array_walk。
致以敬意,
发布于 2013-05-03 05:35:01
请注意,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()。
https://stackoverflow.com/questions/11893596
复制相似问题