2012-06-30 48 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; 
}