【问题标题】:sortBy returns object instead of arraysortBy 返回对象而不是数组
【发布时间】:2020-04-11 12:45:15
【问题描述】:
我有这个代码
$list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
{
return $t->visitors->count();
});
return json_encode($list);
此代码返回对象,而不是数组。怎么改?
【问题讨论】:
标签:
php
arrays
json
laravel
【解决方案1】:
你只需要调用->all()Collection方法,所以
$list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t)
{
return $t->visitors->count();
}
)->all();
这与->toArray() 方法不同,因为它还会将集合内的对象也转换为数组,而不仅仅是集合本身(实际上->all() 不会转换任何内容,它只会返回内部的元素收藏)
【解决方案2】:
$list = Elements::where('list_id', $id)->with('visitors')->get();;
此代码返回集合实例。 $collection->sortBy(...); 也是 Collection 实例。要在 Collection 中获取数组,您必须使用 ->toArray() 或 ->all()
在你的情况下,你可以使用
$list = Elements::where('list_id', $id)->with('visitors')->get()->sortBy(function($t) {
return $t->visitors->count();
})->toArray();
【解决方案3】:
如果你最后想要一个实际的 JSON 数组,你应该添加 ->values()。
由于您可能会添加其他操作,例如过滤器和转换,我会在最后一刻致电 ->values():
return json_encode($list->values());
使用->values() 而不是其他选项的原因是它重置了数组键。如果你尝试返回一些关联数组(比如['name' => 'Roman'] 甚至[1 => 'item', 0 => 'other']),它总是会被编码为一个对象。您需要有一个普通数组(顺序整数键从 0 开始)以避免过滤和排序会做的意外事情。