我有一个对象,它是对象的集合,其行为类似于数组。它是一个数据库结果对象。像下面这样:
$users = User::get();
foreach ($users as $user)
echo $user->name . "\n";
The $users
变量是一个实现了ArrayAccess http://php.net/ArrayAccess and Countable http://php.net/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
How can I对这种对象进行排序和过滤?
你不能。目的ArrayAccess
接口不仅是为数组创建 OOP 包装器(尽管它经常这样使用),而且还允许对集合进行类似数组的访问,而这些集合甚至可能从一开始就不知道其所有元素。想象一下一个 Web 服务客户端,它调用一个远程过程offsetGet()
and offsetSet()
。您可以访问任意元素,但无法访问整个集合 - 这不是集合的一部分ArrayAccess
界面。
如果该对象还实现了Traversable
(via Iterator http://php.net/iterator or IteratorAggregate http://php.net/iteratoraggregate),至少可以用它构造一个数组(iterator_to_array http://php.net/iterator-to-array完成这项工作)。但你仍然必须像这样转换它,原生数组函数only接受数组。
如果您的对象在内部将数据存储为数组,那么最有效的解决方案当然是实现toArray()
返回此数组的方法(并且可能调用toArray()
在包含的对象上递归)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)