PHP:我如何对一个";阵列”;,是一个对象,实现ArrayAccess


PHP: how can I sort and filter an "array", that is an Object, implementing ArrayAccess?

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

$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

如何对此类对象进行排序和筛选?

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

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

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

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

  • ArrayObject::asort
  • ArrayObject::ksort
  • ArrayObject::natcasesort
  • ArrayObject::natsort
  • ArrayObject::uasort
  • ArrayObject::uksort