2017-01-30 7 views
0

Я создал ручную петлю, чтобы сформировать json, который используется другим API в проекте, который я запускаю, см. Ниже.PHP loop для создания вручную JSON

Проблема в том, что API не распознает мой выход json. Я проверил результат своей петли, и все выглядит отлично.

Если я копирую и вставляю напрямую мой результат (эхо), он отлично работает, но через мой цикл он не работает. У кого-нибудь есть идеа?

foreach ($array['hits'] as $key => $value) { 

    $message = $message.'{ 
      "title":"'.$value['Title'].'", 
      "image_url":"'.$value['image'].'", 
      "subtitle":"'.substr($value['Detail'],0,120).'", 
      "buttons":[ 
        { 
          "type":"web_url", 
          "url":"'.SITE_ROOT_URL.$value['URL'].'?utm_source=chatbot", 
          "title":"Leia mais" 
        } 
      ] 
    },'; 

} 

$message = '{"messages": [ 
      { 
        "attachment":{ 
          "type":"template", 
          "payload":{ 
            "template_type":"generic", 
            "elements":['.rtrim($message,",").'] 
          } 
        } 
      } 
    ] 
}'; 

echo $message; 

Выход var_export ($ массив [ 'хиты']) выглядит следующим образом:

array (0 => array ('ID' => '69', 'Title' => 'This is an example', 'URL' => 'example/1', 'Detail' => 'Some description here...', 'image' => 'image1.png', 'objectID' => '75877631')), 1 => array .... 
+0

Вы никогда не должны вручную создать JSON, как это. –

+3

Почему вы не хотите использовать 'json_encode()'? – Barmar

+0

@JayBlanchard Я бы не зашел так далеко, как сказал _never_ вручную создать JSON - есть некоторые настоящие случаи, которые его требуют, но это, конечно же, не один из них. т. е. 'json_encode' может [выводить неправильный тип массива в определенных обстоятельствах] (https://eval.in/727141). –

ответ

3

Не генерировать JSON вручную. Постройте массив, а затем используйте json_encode().

$messages = array(); 
foreach ($array['hits'] as $key => $value) { 
    $messages[] = array(
     'title' => $value['Title'], 
     'image_url' => $value['image'], 
     'subtitle' => substr($value['Detail'], 0, 120), 
     'buttons' => array(
      array(
       'type' => 'web_url', 
       'url' => SITE_ROOT_URL.$value['URL'].'?utm_source=chatbot', 
       'title' => "Leia mais" 
      ) 
     ) 
    ); 
} 
$result = array(
    'messages' => array(
     'attachment' => array(
      'type' => 'template', 
      'payload' => array(
       'template_type' => 'generic', 
       'elements' => $messages 
      ) 
     ) 
    ) 
); 
echo json_encode($result); 

DEMO

Обратите внимание, как элементы вашей рук возведенной JS массивы и объекты карты непосредственно в PHP массивы. Если JSON содержит:

{ "something": "something else" } 

соответствующий РНР:

array("something" => "something else") 
+0

спасибо, извлеченный урок! :-) просто пытается выяснить, почему результат не печатает с помощью echo json_encode ($ result); – czmarc

+0

Это работает для меня. Я добавил демо. – Barmar

+0

У меня была одна ошибка: 'title' вместо' Title'. – Barmar