2013-05-14 54 views
2

我想知道爲什麼像min($array)天然PHP函數不支持Spl Fixed Arrays。好吧gettype會說它是一個對象,但它仍然包含數組數據。PHP本地函數()不支持固定陣列

有數組這麼多有用的PHP函數,但爲了使用它們我必須使用一個額外的方法$fx_array->toArray()。無論何時您決定使用固定陣列,您都必須考慮......我是否需要使用toArray()

+2

它可能以不同的方式實現,min函數接受數組而不是SplFixedArray(不同類型)。 toArray()應該訣竅 – galchen 2013-05-14 12:29:54

+0

奇怪的例子。如果你初始化一個靜態數組,你必須通過這個大小。因此,使用像'min()'這樣的函數是沒有意義的,因爲你已經知道了大小。但有一個方法['SplFixedArray :: getSize'](http://php.net/splfixedarray.getsize.php)。 – feeela 2013-05-14 12:31:44

+0

@galchen是的,我相信同樣的事情,顯然min()是相當低的水平,並且出於效率的原因,它可能會做出一些假設,對於固定數組是不正確的。另一方面,幸好toArray()完美地工作。 – Melsi 2013-05-14 12:33:20

回答

3

由於SplFixedArray工具Iterator,很容易擴展類本身:

class SplFixedArrayOnSteroids extends SplFixedArray 
{ 

    public function min(){ 

    $min = $this[0]; 

    foreach($this as $value) 
    { 

     if($value < $min) 
     $min = $value; 

    } 

    return $min; 

    } 

} 

好吧,我知道這將是更小的便攜式和所有,但歡迎PHP。

+0

技術上'$ min'應該初始化爲'+ Inf文件':) – 2013-05-14 12:35:47

+0

@Jack不需要'+ Inf',因爲'$ min = $ this [0];'很好,我可以說很聰明。 – Melsi 2013-05-14 12:44:02

+1

@Melsi如果數組中沒有元素會怎麼樣? – 2013-05-14 12:48:07

1

因爲SplFixedArray不是終點,因此,你可以擴展它。

爲什麼是一個問題? min()需要迭代它,雖然它可能會觸發意外的行爲。以SplPriorityQueue類爲例,它會在迭代時刪除項目。有人可以很容易地擴展SplFixedArray並做類似的事情。

+0

尼斯你提到的「異常行爲」 – Melsi 2013-05-14 12:54:45

+0

這似乎有點主觀,因爲這並沒有證明這確實是不支持Traversable或ArrayAccess的原因。 – 2013-05-14 12:59:20

+0

嗯,這對我來說似乎合乎邏輯,因爲你需要實現一個count方法才能使count有效。爲什麼其他功能應該有什麼不同?但是,這只是我的意見:) – 2013-05-14 13:13:52