PHP:我如何排序和过滤“数组”,即一个Object,实现ArrayAccess?

时间:2013-02-17 08:08:12

标签: php arrays spl arrayaccess countable

我有一个对象集合,表现得像一个数组。它是一个数据库结果对象。如下所示:

$users = User::get();
foreach ($users as $user)
    echo $user->name . "\n";

$users变量是一个实现ArrayAccessCountable接口的对象。

我想对这个“数组”进行排序和过滤,但我不能在其上使用数组函数:

$users = User::get();
$users = array_filter($users, function($user) {return $user->source == "Twitter";});
=> Warning: array_filter() expects parameter 1 to be array, object given

如何对这类对象进行排序和过滤?

2 个答案:

答案 0 :(得分:8)

你做不到。 ArrayAccess接口的目的不仅仅是为数组创建一个OOP包装器(尽管它经常被这样使用),而且还允许对可能甚至不知道它们的所有元素的集合进行类似数组的访问。开始。想象一下一个Web服务客户端,它调用offsetGet()offsetSet()中的远程过程。您可以访问任意元素,但无法访问整个集合 - 这不是ArrayAccess接口的一部分。

如果对象也实现Traversable(通过IteratorIteratorAggregate),则至少可以从中构造一个数组(iterator_to_array完成工作)。但你仍然必须像这样转换它,原生数组函数只接受接受数组。

如果您的对象在内部将数据存储为数组,那么最有效的解决方案当然是实现一个返回此数组的toArray()方法(并且可能在包含的对象上递归调用toArray())。 / p>

答案 1 :(得分:0)