4

我有一个对象,它是对象的集合,表现得像一个数组。它是一个数据库结果对象。类似于以下内容:

$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

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

4

2 回答 2

8

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

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

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

于 2013-02-17T09:29:44.713 回答
0

您可以使用ArrayObject而不是ArrayAccess,它具有多种本机排序功能:

于 2018-04-03T17:50:50.223 回答