将单个对象转换为包含该对象的数组

时间:2019-06-07 21:14:55

标签: php arrays json object

我有许多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”的数组,而不是包含该对象的一个​​元素。

2 个答案:

答案 0 :(得分:1)

正如我在评论中所说

这样做的时候

$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可以是数组,有时不能为数组,因此您可以制作一个other question来包装它们

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

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

POC:function [1]

[1]从Laravel帮助者中被盗

答案 1 :(得分:0)

使用json_decode()并按以下方式进行访问:

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