注意,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()
代替。
“use'(array)$ this'。他们做同样的事情。” - 不一定,该行为取决于正在使用的标志。 'ArrayIterator :: STD_PROP_LIST'将导致'(array)$ this'来**不**成为存储数组的表示;你可以猜测'ArrayIterator :: ARRAY_AS_PROPS'会做什么。 :) – salathe 2013-05-02 21:49:50
我已经添加了该效果的注释。 'ARRAY_AS_PROPS'似乎并没有改变'(array)$ this'的行为或性能,所以我把它留下了。 – Brilliand 2013-05-03 15:52:17