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);

看看toArray()

也试试

$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