【问题标题】:PHP: how can I sort and filter an "array", that is an Object, implementing ArrayAccess?PHP:我如何排序和过滤一个“数组”,即一个对象,实现 ArrayAccess?
【发布时间】:2013-02-01 20:56:25
【问题描述】:

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

$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

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

【问题讨论】:

  • 似乎 user::get() 函数没有返回数组...检查它是否返回数组
  • 你最好的选择可能是在你的用户对象上实现一个“toArray”方法。
  • ArrayAccess 和 Countable 不足以遍历所有元素,您仍然需要知道键。在我看来,调整User::get() 以接受有关所请求用户类型的附加信息是可行的方法。排序和过滤之类的事情是基于数据的任务,因此最好由数据库来完成。
  • 如果是 SQL 结果集,为什么不让 SQL 为您进行排序?
  • @GordonM:因为有时过滤和排序功能对于 SQL 来说有点太复杂了,我不想在我的数据库中乱扔程序,这些东西属于应用程序逻辑,例如数据库模型。

标签: php arrays spl arrayaccess countable


【解决方案1】:

【讨论】:

    【解决方案2】:

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

    如果对象还实现了Traversable(通过IteratorIteratorAggregate),则至少可以从它构造一个数组(iterator_to_array 完成这项工作)。但是你还是要这样转换,原生数组函数接受数组。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 2021-10-30
      • 2015-01-30
      • 2021-05-14
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多