在Smarty解码json

时间:2014-09-18 13:16:42

标签: php json smarty

我有一个我在控制器中定义的网址:

$musicList = "http://website.com/search?q=$artist&results=30";

这将创建一个包含艺术家30个结果的json文件。在我的模板文件中,我想解码这个json并显示它的twi值。 json看起来像这样:

[
{
artist: "Rihanna",
title: "Rihanna - Diamonds",
trid: "ID"
},
{
artist: "Rihanna",
title: "S&M",
trid: "ID"
},

但我无法弄清楚如何在模板文件中打印它们,以下代码什么都没有给我:

        {foreach from=$musicList item=entry}
        {assign var=song value=$entry|json_decode:1}
        <pre>
            {$song|@print_r}
        </pre>
        {/foreach}

我在PHPFox中使用smarty,如果这与解决这个问题有关。

2 个答案:

答案 0 :(得分:2)

我提到的方法确实有效。

如果在php文件中你有:

$data = array(
    array(

        'artist' => "Rihanna",
        'title'  => "Rihanna - Diamonds",
        'trid'   => "ID"
    ),
    array(

        'artist' => "Rihanna",
        'title'  => "S&M",
        'trid'   => "ID"
    ),        
);


$x = json_encode($data);
$smarty->assign('musicList', $x);

在Smarty你有:

{foreach from=$musicList|json_decode item=song}
    <pre>
            {$song->artist} {$song->title} {$song->trid}
    </pre>
{/foreach}

您将得到理想的结果:

Rihanna Rihanna - Diamonds ID            
Rihanna S&M ID

当然你需要确保你有有效的Json数据(你粘贴的代码是我认为的Json片段)

编辑 - 包含实际数据的代码

在PHP文件中:

$smarty->assign('musicList', file_get_contents('http://f.cl.ly/items/1C1P2v1U1i1a3i181a0T/search.json'));

在Smarty文件中 - 与我已经说过的相同

结果仍然如预期 - 没有错误或警告

答案 1 :(得分:-1)

我通过在PHP文件中执行以下操作来实现此目的:

$url = file_get_contents("http://labs.echonest.com/Uploader/search?q=$artist&results=30");
        $json = json_decode($url, true);

        $trackname = array();
        $url = array();
        $i = 0;
        if($artist) {
            foreach ($json as $track) {
            $trackname = $track['title'];
            $url = $track['trid'];
            $artists[] = $track['artist'];
            $tester[] = "<a href='$url'>$trackname</a>";
            $i++;
        }

        } else {
                echo Phpfox::getPhrase('lastfm.not_connected');
        } 

然后我将它分配给我的模板:

'songs' => $tester,

并称之为:

{foreach from=$songs item=song}{$song}<br/>{/foreach}