2012-06-30 2 views
2

У меня есть данные в ArrayObject, просто представляя массив. Мне нужно фильтр данные, функции array_filter() будет работать отлично. Тем не менее, он не работает с ArrayObject как аргумент. Каков наилучший способ лечения? Есть ли какая-либо стандартная функция, которая обрабатывает фильтрацию для меня?Фильтр ArrayObject (PHP)

Пример:

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

Есть ли array_object_filter функция?

+0

Не можете использовать цикл Еогеасп? –

+0

Да, могу. Но для меня это кажется немного уродливым. Я знаю несколько подходов к решению этой проблемы, но я хотел бы услышать лучший. Ничто из того, что я знаю, действительно чистое. –

+0

Что вы подразумеваете под «чистым»? Вам не кажется, что array_filter() использует цикл внутри? –

ответ

3

Как насчет экспортировать его фактический массив, а затем создать новый массив Объект?

$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; 
} 
Смежные вопросы