Laravel 分组集合 returns 对象而不是数组
Laravel grouped collection returns object instead of array
我有以下查询
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings
], 200);
响应是 returning 一个对象,我需要它 return 一个数组
如何让 outings 成为数组而不是对象。
如果我不对集合进行分组而只做
Outing::all();
它将return一个数组而不是一个对象。 Group by 正在做一些奇怪的事情。
如果我 DD($outings) 它实际上是 return 一个集合,所以我认为当 returned 到浏览器而不是数组时它被转换为一个对象是很奇怪的.
下面是我 DD($outings->toArray())
时的输出
谢谢
尝试做:
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings->toArray()
], 200);
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->toArray();
return response()->json([
'outings' => $outings
], 200);
也试试
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->toArray();
return response()->json([
'outings' => json_encode($outings)
], 200);
If you want array then use this
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->map(function($item){
return $item->all();
});
return response()->json($outings, 200);
If you want date as key then
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json($outings->toArray(), 200);
使用array_values($array)
将关联数组强制转换为JSON 数组。但是,您将以这种方式丢失任何键名。
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => array_values($outings)
], 200);
没有人真正解释过为什么会这样。
在JavaScript/JSON中,数组只是值的集合,它们是有键的,但键总是按顺序排列的数字。
在PHP中,数组是"key" => "value"
对的集合,键可以是任何东西(整数或字符串),但数组通常可以被认为是"associative"(键是非-numerical, or numerical but not in sequence) or "non-associative" (这里key是numerical AND in sequence (类似于JS数组).
当谈到将 PHP 数组编码为 JSON 时,假设一个数组具有非数字键或键是数字但不按顺序排列(例如 0、1、 2, 4, 5, 8, 10) - 这些类型的数组与 JavaScript/JSON 数组不兼容。在这种情况下,数组被转换为对象以保留键。要强制将数组转换为数组,您必须将数组转换为非关联数组(数字序列键),PHP 有函数 array_values
来帮助完成此操作。
在 laravel 8
public function index()
{
$products = Product::all()->toArray();
return array_reverse($products);
}
使用 ->values()
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings->values()
], 200);
关于 Laravel 8 在 Vue3 中使用 Inertia.js,我 运行 遇到了类似的问题。我试图 return 对象数组 Array<{label, name}>
我的解决方法是
return collect($myArray)->map(function($key, $value) {
return [
'name' => $value,
'label' => $key
];
})->values(); // <---- this guy
我有以下查询
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings
], 200);
响应是 returning 一个对象,我需要它 return 一个数组
如何让 outings 成为数组而不是对象。
如果我不对集合进行分组而只做
Outing::all();
它将return一个数组而不是一个对象。 Group by 正在做一些奇怪的事情。
如果我 DD($outings) 它实际上是 return 一个集合,所以我认为当 returned 到浏览器而不是数组时它被转换为一个对象是很奇怪的.
下面是我 DD($outings->toArray())
时的输出谢谢
尝试做:
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings->toArray()
], 200);
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->toArray();
return response()->json([
'outings' => $outings
], 200);
也试试
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->toArray();
return response()->json([
'outings' => json_encode($outings)
], 200);
If you want array then use this
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
})->map(function($item){
return $item->all();
});
return response()->json($outings, 200);
If you want date as key then
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json($outings->toArray(), 200);
使用array_values($array)
将关联数组强制转换为JSON 数组。但是,您将以这种方式丢失任何键名。
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => array_values($outings)
], 200);
没有人真正解释过为什么会这样。
在JavaScript/JSON中,数组只是值的集合,它们是有键的,但键总是按顺序排列的数字。
在PHP中,数组是"key" => "value"
对的集合,键可以是任何东西(整数或字符串),但数组通常可以被认为是"associative"(键是非-numerical, or numerical but not in sequence) or "non-associative" (这里key是numerical AND in sequence (类似于JS数组).
当谈到将 PHP 数组编码为 JSON 时,假设一个数组具有非数字键或键是数字但不按顺序排列(例如 0、1、 2, 4, 5, 8, 10) - 这些类型的数组与 JavaScript/JSON 数组不兼容。在这种情况下,数组被转换为对象以保留键。要强制将数组转换为数组,您必须将数组转换为非关联数组(数字序列键),PHP 有函数 array_values
来帮助完成此操作。
在 laravel 8
public function index()
{
$products = Product::all()->toArray();
return array_reverse($products);
}
使用 ->values()
$outings = Outing::all()->groupBy(function ($item) {
return Carbon::parse($item['start'])->format('m/d/Y');
});
return response()->json([
'outings' => $outings->values()
], 200);
关于 Laravel 8 在 Vue3 中使用 Inertia.js,我 运行 遇到了类似的问题。我试图 return 对象数组 Array<{label, name}>
我的解决方法是
return collect($myArray)->map(function($key, $value) {
return [
'name' => $value,
'label' => $key
];
})->values(); // <---- this guy