【问题标题】:Convert Single Object into an Array containing that Object将单个对象转换为包含该对象的数组
【发布时间】:2019-06-07 21:14:55
【问题描述】:

我有许多 JSON 文件,当其中只有一个对象时,它们的数据类型不一致。我正在尝试更改包含一项的文件,以便我引用的元素始终是一个数组。

这是一个“好”JSON 文件的示例:

{
  "apiv2": {
    "items": [{
      "id": "00001",
      "name": "ITEM 1"
    }, {
      "id": "00002",
      "name": "ITEM 2"
    }]
  }
}

在 PHP 术语中,$json->apiv2->items 始终是一个数组,我可以对其应用相同的函数。

我经常有一个包含一项的 JSON 文件:

{
  "apiv2": {
    "items": {
      "id": "00003",
      "name": "ITEM 3"
    }
  }
}

当我尝试使用相同的函数遍历“项目”时,它们会失败,因为它现在是一个对象而不是一个数组。

我的目标是更改 JSON 数据并重写文件,使单项文件与多项文件保持一致:

{
  "apiv2": {
    "items": [{
      "id": "00003",
      "name": "ITEM 3"
    }]
  }
}

也许是因为现在是星期五下午,但我似乎无法理解这一点。我认为这很简单:

$json->apiv2->items = (array) $json->apiv2->items;

但这只是将它变成一个包含两个元素“id”和“name”的数组,而不是一个包含对象的元素。

【问题讨论】:

  • 转换为数组的对象,将是具有对象属性的数组,但不是数组中的对象。 $json->apiv2->items = [$json->apiv2->items]; 呢?
  • 你不能用true解码成数组吗,那样迭代的代码是一样的

标签: php arrays json object


【解决方案1】:

正如我在 cmets 中所说的

当你这样做时

$json->apiv2->items = (array) $json->apiv2->items;

PHP 会将 $items 转换为实际数组 [ "id" => "00003", "name" => "ITEM 3"] 这会给你结果['items' => [ "id" => "00003", "name" => "ITEM 3"]]

您需要包装它,而不是转换您的对象

$json->apiv2->items = [$json->apiv2->items];

更高级:因为有时items 可以是一个数组,有时不是,你可以创建一个function [1] 来包装它们

function wrap($value)
{
    if (is_null($value)) {
        return [];
    }
    return is_array($value) ? $value : [$value];
}

$json->apiv2->items = wrap($json->apiv2->items);

POC:https://3v4l.org/7p9b0

[1] 从 Laravel 助手那里偷来的

【讨论】:

  • 我认为这很简单,我只是无法概念化它,谢谢!
  • @CMarcera 没问题 :) 有时最好的答案应该是“休息一下”
【解决方案2】:

使用json_decode() 并像这样访问它:

$json = '{"apiv2":{"items": [{"id": "00001", "name": "ITEM 1" }, {"id": "00002", "name": "ITEM 2" }]}}';
print_r(json_decode($json, true)['apiv2']['items']);

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2017-09-11
    • 2022-06-18
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多