Laravel 分组集合返回对象而不是数组

Kyl*_*son 4 laravel laravel-collection

我有以下查询

$outings = Outing::all()->groupBy(function ($item) {
   return Carbon::parse($item['start'])->format('m/d/Y');
});

return response()->json([
    'outings' => $outings
], 200);
Run Code Online (Sandbox Code Playgroud)

响应返回一个对象,我需要它返回一个数组 如您所见,outings 是一个对象而不是数组

我怎样才能让郊游成为一个数组而不是一个对象。

如果我不将集合分组而只是这样做

Outing::all();
Run Code Online (Sandbox Code Playgroud)

它将返回一个数组而不是一个对象。Group by 正在做一些奇怪的事情。

如果我 DD($outings) 它实际上返回一个集合,所以我认为它在返回到浏览器而不是数组时被转换为一个对象是很奇怪的。

下面是我 DD($outings->toArray()) 时的输出

在此处输入图片说明

谢谢

Tur*_*ilz 8

用于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);
Run Code Online (Sandbox Code Playgroud)

没有人真正解释过为什么会发生这种情况。

在 JavaScript/JSON 中,数组只是值的集合,它们是有键的,但键总是按顺序排列的数字。

在 PHP 中,数组是"key" => "value"成对的集合,键可以是任何东西(整数或字符串),但数组通常可以被认为是“关联的”(其中键是非数字的,或数字但不按顺序)或“非关联的” (其中键是数字 AND 顺序(类似于 JS 数组)。

在将 PHP 数组编码为 JSON 时,假设数组具有非数字键或键是数字但不按顺序排列(例如 0、1、2、4、5、8、10) - 这些类型数组与 JavaScript/JSON 数组不兼容。在这种情况下,数组被转换为一个对象以保留键。要强制将数组转换为数组,必须将数组转换为非关联数组(按数字顺序排列的键),PHP 有功能array_values可以帮助完成此操作。


mik*_*oop 7

使用 ->values()

$outings = Outing::all()->groupBy(function ($item) {
   return Carbon::parse($item['start'])->format('m/d/Y');
});

return response()->json([
    'outings' => $outings->values()
], 200);
Run Code Online (Sandbox Code Playgroud)

  • 你救了我的命! (2认同)
  • 这对我有用,谢谢!就我而言,我的集合迭代修改了每个项目的键 - 这是将返回呈现为对象而不是数组的原因。- 因此需要 **->values()** 来按连续顺序重置键。[值()](https://laravel.com/docs/9.x/collections#method-values) (2认同)

小智 6

在 Laravel 8 上使用 Inertia.js 和 Vue3 时,我遇到了类似的问题。我试图返回一个对象数组Array<{label, name}>

我解决的方法是

return collect($myArray)->map(function($key, $value) {
   return [
      'name' => $value,
      'label' => $key
    ];
   })->values(); // <---- this guy 
Run Code Online (Sandbox Code Playgroud)


rkj*_*rkj 5

如果你想要数组,那么使用这个

$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);
Run Code Online (Sandbox Code Playgroud)

如果你想要日期作为键那么

$outings = Outing::all()->groupBy(function ($item) {
   return Carbon::parse($item['start'])->format('m/d/Y');
});

return response()->json($outings->toArray(), 200);
Run Code Online (Sandbox Code Playgroud)