2012-08-09 69 views
2

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

请考虑下面的例子:是使用$this->getArrayCopy()代替??? OK

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

?有没有更好的解决方案呢?性能如何?

如何动态改变类的数组?例如使用array_walk。

问候,

回答

2

注意,ArrayIterator类实现ArrayAccess。修改数组,只需把$这是一个数组:

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

不幸的是,功能,如in_array不要阵列状物体工作;你需要一个真正的数组。 getArrayCopy()会工作,但我只会使用(array) $this

编辑:在评论作为salathe笔记,getArrayCopy()比较好,因为它总是得到内部数组,而(array) $this将表现不同,如果您使用STD_PROP_LIST标志。

在性能方面,制作像这样的数组副本确实会导致一个小的减速。作为一个基准测试,我在一个1000000个物品的ArrayIterator上尝试getArrayCopy()(array),并且在我的机器上花费了大约0.11秒。另一方面,in_array操作本身(在所得到的阵列上)耗时0.011秒 - 约为十分之一。在我的机器上0.07秒

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

该函数运行的是不存在的价值,这是最坏的情况下此搜索时:

我也试过这个版本的in_array功能算法。

在大多数情况下,性能问题太小而不重要。如果你的情况足够极端,每个数组元素100纳秒左右实际上有所作为,那么我建议将想要搜索的值放入数组键中,并使用offsetExists()代替。

+1

“use'(array)$ this'。他们做同样的事情。” - 不一定,该行为取决于正在使用的标志。 'ArrayIterator :: STD_PROP_LIST'将导致'(array)$ this'来**不**成为存储数组的表示;你可以猜测'ArrayIterator :: ARRAY_AS_PROPS'会做什么。 :) – salathe 2013-05-02 21:49:50

+0

我已经添加了该效果的注释。 'ARRAY_AS_PROPS'似乎并没有改变'(array)$ this'的行为或性能,所以我把它留下了。 – Brilliand 2013-05-03 15:52:17