【问题标题】:Laravel grouped collection returns object instead of arrayLaravel 分组集合返回对象而不是数组
【发布时间】:2018-12-07 18:47:14
【问题描述】:

我有以下问题

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

return response()->json([
    'outings' => $outings
], 200);

响应返回一个对象,我需要它返回一个数组

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

如果我不对集合进行分组而只是这样做

Outing::all();

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

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

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

谢谢

【问题讨论】:

  • 发送return response()->json($outings, 200);
  • 感谢@rkj,但是仍然会向浏览器返回一个对象。
  • toArray() 添加到$outings。所以它将是$outings->toArray();
  • 一文不值Eloquent Resources
  • @bak87,这是我尝试的第一件事,它仍然返回一个对象。谢谢

标签: laravel laravel-collection


【解决方案1】:

尝试做:

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

return response()->json([
    'outings' => $outings->toArray()
], 200);

【讨论】:

  • 这是我尝试的第一件事,仍然返回一个对象
  • @KyleReierson 分组后尝试dd($outings->toArray()) 时能否向我们展示输出?
【解决方案2】:
$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);

【讨论】:

  • 这是我尝试的第一件事,仍然返回一个对象
  • @KyleReierson 试试(\Arrayable) $outings 看看会发生什么
【解决方案3】:

如果你想要数组然后使用这个

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

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

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

return response()->json($outings->toArray(), 200);

【讨论】:

  • 这仍然会返回一个对象数组
  • 行得通!但是,我需要将日期作为分组中的关键。 array_values 将它们重置为 0,1,2 等
  • 如果您将日期保留为分组,那么它将再次返回您的对象
  • @KyleReierson 你要么得到数组,要么如果你想要日期作为键,那么你必须有对象,因为关联数组转换为 json 对象。
  • 啊,呃。谢谢你的帮助!在使用 array_values 后,我能够使用它并以我需要的格式获取数据
【解决方案4】:

使用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" 对的集合,键可以是任何东西(整数或字符串),但数组通常可以被认为是“关联的”(键是非数字的,或数字但不按顺序排列)或“非关联”(其中键是数字 AND 顺序(类似于 JS 数组)。

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

【讨论】:

  • 我喜欢这个解释。很有道理??
【解决方案5】:

在 laravel 8 上

 public function index()
    {
        $products = Product::all()->toArray();
        return array_reverse($products);      
    }

【讨论】:

    【解决方案6】:

    使用 ->values()

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

    【讨论】:

    • 你拯救了我的一天!
    猜你喜欢
    • 2015-04-30
    • 2020-01-05
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2020-01-10
    • 2018-07-20
    相关资源
    最近更新 更多