【问题标题】:PHP loop to manually create a JSONPHP循环手动创建JSON
【发布时间】:2017-06-16 05:13:22
【问题描述】:

我创建了一个手动循环来形成一个 json,供我正在启动的项目中的另一个 API 使用,请在下面找到。

问题是 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['hits']) 的输出如下所示:

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

【问题讨论】:

  • 你不应该像那样手动创建 JSON。
  • 你为什么不想使用json_encode()
  • @JayBlanchard 我不会说从不手动创建 JSON - 确实有一些真正的案例需要它,但这肯定不是其中之一他们。即json_encode 可以output the wrong kind of array in certain circumstances
  • 你能发布$array['hits']的值吗?使用var_export(),以便我们可以将其粘贴到脚本中。
  • FWIW,最初的问题是它在最后添加了一个额外的,。其他一切都有效,除非例如“标题”包含非法字符。 (即考虑如果你的标题是:"Hello!" - Greetings and you 会发生什么。这些引号会导致它生成无效的 JSON。)

标签: php json foreach


【解决方案1】:

不要手动生成 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

注意您手工构建的 JSON 数组和对象的元素如何直接映射到 PHP 数组。如果 JSON 包含:

{ "something": "something else" }

对应的PHP是:

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

【讨论】:

  • 谢谢,学习了! :-) 只是想弄清楚为什么结果没有打印 echo json_encode($result);
  • 我犯了一个错误,title 而不是Title
  • 我的 $results['hits] 数组以这种格式为我提供“ Array( [0] => Array ( [ID] => 69 [Title] => 这是一个示例”,即与 var_export 不同。在我的循环中,这些值没有与 messages[] 数组关联。它只有在我这样做时才有效/打印,例如,echo $value['Title'];
  • 这是我收到的原始结果:github.com/algolia/…
  • @czmarc var_dump()var_export() 之间的区别在于后者以PHP代码的格式打印,因此可以像我在演示中那样将其放入另一个脚本中。数据的结构是一样的。
猜你喜欢
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2016-08-16
相关资源
最近更新 更多