Вернуть json enconde ассоциативный массив только один элемент - PullRequest
0 голосов
/ 30 апреля 2018

у меня есть $variable = array(...);

И мне нужно напечатать ответ JSON, подобный этому

{
  info: {
    "foo": true,
    "bar": "lion"
  },
  data: [
    {"id": 123,
     "name": "foo",
     "baz": {  "some":1,
               "data":true
             }
    },
    {"id": 321,
     "name": "bar",
     "baz": {}
    }
  ]
}

Итак, проблема в response["data"][1]["baz"]

Иногда эта переменная может быть пустым массивом {}, но когда я использую json_encode, вернуть это как неассоциативный массив []

Мне нужна эта переменная как ассоциативный массив

но если в PHP мы поставим

echo json_encode($variable,JSON_FORCE_OBJECT);

Верните это

{
  info: {
    "foo": true,
    "bar": "lion"
  },
  data: {
    0: {"id": 123,
        "name": "foo",
        "baz": {  "some":1,
                  "data":true
                }
    },
    1: {"id": 321,
        "name": "bar",
        "baz": {}
       }
  ]
}

и response["data"] должны быть неассоциативным массивом

Таким образом,

  • вернуть baz в виде ассоциативного массива {} (даже если он пуст, здесь проблема).
  • вернуть data всегда как неассоциативный массив [].

response["data"] должен быть списком, потому что читается внешней библиотекой в ​​javascript

1 Ответ

0 голосов
/ 30 апреля 2018

Если вы сделаете рассматриваемое свойство ArrayObject, а не встроенным массивом, оно будет сериализовано как объект независимо от того, является ли оно пустым.

# Converting the existing array, which may be empty, to an ArrayObject
$baz = new ArrayObject($baz);

# Or create a new ArrayObject
$baz = new ArrayObject();
$baz['a'] = 'b';

В качестве альтернативы вы можете использовать класс stdClass в тех случаях, когда массив пуст. Это будет сериализовано как пустой объект ({}).

if (empty($baz)) {
    $baz = new stdClass();
}
...