Лучшая практика: создание вложенного ассоциативного массива JSON в PHP

Я уже давно здесь и надеюсь, что все еще понимаю правила ». Недавно я начал изучать PHP и WordPress для интеграции чат-бота WhatsApp. Я создал на своем сайте WordPress веб-перехватчик, который возвращает JSON, который используется Google Dialogflow (движком чат-бота).

Например, мой веб-перехватчик возвращает что-то вроде этого

{
  "fulfillmentMessages": [
    {
      "text": {
        "text": [
          "Text response from webhook"
        ]
      }
    }
  ]
}

Чтобы достичь этой структуры, я написал, что использовал этот вложенный ассоциативный массив

$innerarr= array();
$innerarr[0] = "Text response from webhook";
$newarr = array();
$newarr["fulfillmentMessages"]= array();
$newarr["fulfillmentMessages"][0] = array("text"=>array("text"=>$innerarr));
echo json_encode($newarr);

Это работает, но я тоже думаю, стоит ли мне

  1. Использовать вместо этого определение класса, которое управляет указанным выше?
  2. Использовать объект stdClass для динамического создания этой структуры?
  3. Есть ли более аккуратный способ сделать это, поскольку динамические свойства будут расти в зависимости от запроса от чат-бота?
  4. Я слишком много думаю?

2 ответа
2

Можете ли вы использовать инструмент конвертера, который поможет вам понять структуру преобразования, например: wtools.io. В этом случае структура массива PHP для вашего json похожа на:

$innerarr = array (
  'fulfillmentMessages' => 
  array (
    0 => 
    array (
      'text' => 
      array (
        'text' => 
        array (
          0 => 'Text response from webhook',
        ),
      ),
    ),
  ),
);

echo json_encode($innerarr);

или, используя массивы сортировки:

$innerarr = [
  'fulfillmentMessages' => [
    0 => [
      'text' => [
        'text' => [
          0 => 'Text response from webhook',
        ],
      ],
    ],
  ],
];

echo json_encode($innerarr);

  • 2

    Вы предложили два альтернативных подхода, но я не уверен, что вы предоставили обзор. Почему $innerarr хорошее имя переменной для всего набора данных?

    — микмакуса


Ваш расплывчатый образец показывает, что вы вставляете в структуру только одно текстовое сообщение.

  • Я не вижу веских причин объявлять переменные в вашем примере скрипта.
  • Также нет никакой пользы в создании объектов, потому что json_encode() будет использовать тот же синтаксис при преобразовании данных в строку json.

Я рекомендую вам отказаться от одноразовых переменных и написать необходимую структуру прямо в json_encode() вызов.

Код: (Демо с JSON_PRETTY_PRINT для удобочитаемости)

echo json_encode(
         [
             'fulfillmentMessages' => [
                 [
                     'text' => [
                         'text' => [
                             'Text response from webhook',
                         ]
                     ]
                 ]
             ]
         ]
     );

Я не могу посоветовать «динамические свойства будут расти в зависимости от запроса от чат-бота«потому что вы не совсем поняли, как будут выглядеть эти данные. Запрашивать» Общие рекомендации «не по теме CodeReview.

  • 1

    Просто для полноты, никакой разницы при использовании ассоциативных массивов или объектов. Есть одно исключение — пустой массив против пустого объекта. Один кодируется как массив, а другой как объект. Если не используется JSON_FORCE_OBJECT ….

    — куры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *