2012-08-09 67 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