注意,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