我有一个对象,它是对象的集合,表现得像一个数组。它是一个数据库结果对象。类似以下内容:
$users = User::get();
foreach ($users as $user)
echo $user->name . "'n";
$users
变量是实现ArrayAccess
和Countable
接口的对象。
我想对这个"数组"进行排序和过滤,但我不能在上面使用数组函数:
$users = User::get();
$users = array_filter($users, function($user) {return $user->source == "Twitter";});
=> Warning: array_filter() expects parameter 1 to be array, object given
如何对此类对象进行排序和筛选?
你不能。ArrayAccess
接口的目的不仅是为数组创建OOP包装器(尽管它经常被这样使用),而且还允许对那些可能从一开始就不知道其所有元素的集合进行类似数组的访问。想象一个web服务客户端,它调用offsetGet()
和offsetSet()
中的远程过程。您可以访问任意元素,但不能访问整个集合——这不是ArrayAccess
接口的一部分。
如果该对象还实现了Traversable
(通过Iterator
或IteratorAggregate
),那么至少可以从中构造一个数组(iterator_to_array
完成这项工作)。但是您仍然必须这样转换它,本机数组函数仅接受数组。
如果您的对象将数据作为数组存储在内部,那么最有效的解决方案当然是实现一个返回该数组的toArray()
方法(并可能对包含的对象递归调用toArray()
)。
您可以使用ArrayObject
而不是ArrayAccess
,它具有多种本机排序功能:
ArrayObject::asort
ArrayObject::ksort
ArrayObject::natcasesort
ArrayObject::natsort
ArrayObject::uasort
ArrayObject::uksort