Question

I have my data in ArrayObject, simply representing an array. I need to filter the data, function array_filter() would work great. However, it does not work with ArrayObject as argument. What's the best way to treat with this? Is there any standard function which handles filtering for me?

Example:

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

Is there any array_object_filter function?

Was it helpful?

Solution

How about you export it to an actual array, and then create a new Array Object?

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

OTHER TIPS

How about subclassing the ArrayObject and adding a new method to it:

/**
 * 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;
}

How about this:

$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;

Alternately, you can define an array_object_filter() function yourself:

function array_object_filter($array, $callback) {
    $result = new ArrayObject;
    foreach ($array as $k => $item) if ($callback($item)) $result[$k] = $item;
    return $result;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top