【问题标题】:Converting an array of arrays from Laravel's collection into an object with an array in json将 Laravel 集合中的数组数组转换为带有 json 数组的对象
【发布时间】:2016-08-19 08:52:41
【问题描述】:

我在我的 Laravel API 中生成了一组类别和子类别,用于我的客户端应用程序。

我通过使用集合的filtermap 方法来组织从数据库中提取的数据:

// get the data from the category table
$categoryData = $categories->all()->categories();

// filter the data by category names we know we want and create the multi-dimensional array of the fields we need
$categoryList = $categoryData->filter(function ($value) {
    return $value['Category'] == "by Area of Interest" || $value['Category'] == "by Grade Level";
})
->map(function ($value) {
    return ['category' => $value['Category'], 'subCategory' => $value['Subcategory']];
});

dd($categoryList);

当我查看 die 和 dump 结果时,我得到了包含正确格式项目数组的集合:

如果我将它作为数组输出:

dd($categoryList->toArray());

我看到了我期望的多维数组。

我遇到的问题是当我尝试将其输出为 json 以供我的客户端应用程序使用时。

dd($categoryList->toJson());

如果我输出为 json,我会得到一个对象,其中包含 php 数组索引作为属性,以及 php 子数组作为分配给这些属性的对象。

我想要的是一个包含对象数组的 json 对象。例如

$categoryList = [['category' => 'test', 'subCategory' => 'test'], ['category' => 'test', 'subCategory' => 'test']];
dd(json_encode($categoryList));

哪些输出:

我的收款电话有什么问题吗?

更新

根据 Hognbin 的评论:

$categories->all()->categories(); 的调用会返回一个类别数据集合,然后我会对其进行操作以获取我的列表。

$categoryData = $categories->all()->categories();
dd($categoryData);

产量:

【问题讨论】:

  • 我认为问题出在$categories->all()->categories(),你能显示categories()的代码吗?
  • 我更新了我的帖子。我没有从 categories 方法中添加代码,因为虽然它的输出与问题相关,但它的代码不是;输出是我正在使用的起始数据。
  • 你已经尝试过这样的事情: $return = $categoryList->toArray() return Response::json($return, 200, [], JSON_NUMERICK_CHECK);
  • @HongbinWang,类似,但不同,因为这个专门围绕 laravel 的 Collection 类。

标签: php json laravel functional-programming laravel-5.2


【解决方案1】:

问题是索引是类别的 ID,当您尝试从中创建数组时,您将从 eloquent 集合中获得。

如果你想要一个干净的对象数组,我建议这样做:

json_encode(array_values($categoryList->toArray()));

Chris 的最终实现

上面的解释和函数调用得到了我需要的最终结果。在通过这些函数调用确认它可以工作后,我查看了Collection 类方法,以了解如何使用该类来实现它。这是我所做的:

$categoryList = $categoryData->filter(function ($value) {
    return $value['Category'] == "by Area of Interest" || $value['Category'] == "by Grade Level";
})
->map(function ($value) {
    return ['category' => $value['Category'], 'subCategory' => $value['Subcategory']];
})
->values()
;

如果您查看Collection 类的values() 方法,它正在做同样的事情:

由于 Laravel 集合 items 存储为数组,因此不需要调用 toArray() 方法。

【讨论】:

  • 啊,谢谢!这绝对让我得到了我需要的东西。我最终实现了它有点不同(它使用 laravel 集合类的方法来使其适合其余的功能链),但我能够把这个链放在一起的唯一原因是看到这个评论并弄清楚如何通过 laravel 的集合类来做到这一点。我将编辑您的答案,以便您可以看到原始答案以及我最终将其添加到代码中的方式。感谢您的帮助!
  • @Filip Koblański 也许你可以帮助我。看看这个:stackoverflow.com/questions/51488623/…
猜你喜欢
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2016-09-19
相关资源
最近更新 更多