2012-06-30 49 views
2

我有我的數據在ArrayObject,只是表示一個數組。我需要過濾器的數據,功能array_filter()會很好。但是,不工作ArrayObject作爲參數。用這個對待什麼是最好的方法?是否有任何標準函數可以爲我處理過濾?Filter ArrayObject(PHP)

例子:

$my_data = ArrayObject(array(1,2,3)); 
$result = array_object_filter($my_data, function($item) { return $item !== 2; }); 

有任何array_object_filter功能?

+0

你不能使用foreach循環? –

+0

是的,我可以。但對我來說這似乎有點難看。我知道解決這個問題的幾種方法,但我想聽到最好的一個。我所知道的都不是很乾淨。 –

+0

「乾淨」是什麼意思?你不覺得array_filter()在內部使用循環嗎? –

回答

3

你怎麼樣將它導出到一個實際的數組,然後創建一個新的Array目的?

$my_data = new ArrayObject(array(1,2,3)); 
$result = new ArrayObject( 
    array_filter((array) $my_data, function($item) { 
     return $item !== 2; 
    }) 
); 
+0

我做到了這一點,但對我來說似乎很難看。有什麼更漂亮的?既然它是對象,我可以擴展它,並添加過濾器方法...但標準庫中沒有任何東西嗎? –

+0

@PavelS。無論如何,我不知道。顯然,你確實可以將ArrayObject擴展到一個FilterableArrayObject,它接受一個匿名函數並負責過濾。這可能是「最乾淨的」解決方案,儘管我認爲當你過濾時,你最終會得到一個不同的ArrayObject實例,所以這個解決方案似乎是最優的。 –

0

如何:

$my_data = new ArrayObject(array(1,2,3)); 
$callback = function($item) { return $item !== 2; }; 
$result = new ArrayObject; 
foreach ($my_data as $k => $item) if ($callback($item)) $result[$k] = $item; 

或者,你可以定義一個array_object_filter()函數自己:

function array_object_filter($array, $callback) { 
    $result = new ArrayObject; 
    foreach ($array as $k => $item) if ($callback($item)) $result[$k] = $item; 
    return $result; 
} 
0

如何繼承的ArrayObject的並增加了新的方法吧:

/** 
* Filters elements using a callback function. 
* 
* @param callable $callback The callback function to use 
* 
* @return self 
*/ 
public function filter(/* callable */ $callback = null) 
{ 
    $this->exchangeArray(array_filter($this->getArrayCopy(), $callback)); 
    return $this; 
}