Преобразование одного объекта в массив, содержащий этот объект - PullRequest
0 голосов
/ 08 июня 2019

У меня есть несколько файлов 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 ]

1 голос
/ 08 июня 2019

Как я уже сказал в комментариях

Когда вы делаете

$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 может быть массивом, а иногда нет, вы можете сделать функцию [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] Украдены у помощников Ларавела

0 голосов
/ 08 июня 2019

Используйте json_decode() и получите к нему следующий доступ:

$json = '{"apiv2":{"items": [{"id": "00001", "name": "ITEM 1" }, {"id": "00002", "name": "ITEM 2" }]}}';
print_r(json_decode($json, true)['apiv2']['items']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...