CMarcera
CMarcera

Reputation: 89

Convert Single Object into an Array containing that Object

I have a number of JSON files and when there is a single object in them, their datatype is inconsistent. I am trying to alter the files that contain one item so that the element I am referencing is always an array.

Here's an example of a 'good' JSON file:

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

In PHP terms, $json->apiv2->items is always an array I can apply the same functions to.

Every so often I have a JSON file that contains one item:

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

When I attempt to iterate through 'items' with the same functions, they fail as it is now an object instead of an array.

My goal is to alter the JSON data and rewrite the file so the single item files are consistent with the multiple item files:

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

Maybe it's because it's Friday afternoon, but I can't seem to wrap my head around this one. I thought it would be as simple as:

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

But that just turns it into an array with two elements, "id" and "name", not one element with the object.

Upvotes: 0

Views: 197

Answers (1)

Clément Baconnier
Clément Baconnier

Reputation: 6068

As I said in the comments

When you do

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

PHP will convert $items to an actual array [ "id" => "00003", "name" => "ITEM 3"] Which will give you the results ['items' => [ "id" => "00003", "name" => "ITEM 3"]]

Instead of converting your object, you need to wrap it

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

More advanced: since sometimes items can be an array and sometimes not, you can make a function [1] to wrap them

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] Stolen from Laravel helpers

Upvotes: 1

Related Questions