【问题标题】:Looping through JSON fails with json_decode使用 json_decode 循环遍历 JSON 失败
【发布时间】:2013-11-07 17:42:59
【问题描述】:

我正在从 URL 中提取 JSON 数据并尝试显示仅包含显示名称的列表。

在某种程度上,如果我知道每次都会返回 X 数量的结果,这将非常容易循环。但是,返回的结果将在 0 到 50+ 之间变化。

我已经做了很多搜索,都说“只使用 json_decode”……但情况并非如此。

我有以下 JSON:

{
    "ACK": "SUCCESS",
    "ERROR": null,
    "AGENT": {
        "has_results": 1,
        "agents": [
            {
                "display_name": "Alex",
                "time_in_state": "5214",
                "state": "Aux",
                "callstakentoday": null,
                "callsouttoday": null,
                "agntpriority": null,
                "skill_num": "76"
            },
            {
                "display_name": "Bill",
                "time_in_state": "6312",
                "state": "Aux",
                "callstakentoday": null,
                "callsouttoday": null,
                "agntpriority": null,
                "skill_num": "76"
            },
            {
                "display_name": "Carrie",
                "time_in_state": "5982",
                "state": "Aux",
                "callstakentoday": null,
                "callsouttoday": null,
                "agntpriority": null,
                "skill_num": "76"
            },
            {
                "display_name": "David",
                "time_in_state": "4226",
                "state": "Aux",
                "callstakentoday": null,
                "callsouttoday": null,
                "agntpriority": null,
                "skill_num": "76"
            }
        ]
    },
    "SKILL": {
        "has_results": 1,
        "num_skills": 1,
        "skills": [
            {
                "display_name": "Phone Skills",
                "skill_num": "76",
                "callsinqueue": "0",
                "callstoday": "9",
                "abandtoday": "0",
                "lwt": "0",
                "ewt": "0",
                "servicelvl": "100",
                "avgspeedans": "6",
                "talktime": "289"
            }
        ]
    },
    "TIME": 1383766541
}

根据我阅读的示例和文档,创建了以下代码:

<?php
    $url="http://myjsonurl.local";

    $json = file_get_contents($url);
    //echo $json; 

    $json = json_decode($json);
    foreach($json as $item->display_name)
    {
            echo $item->agents->display_name;
    }
?>

我的最终目标是拥有一个仅包含名称的列表,然后我可以将其显示在备用网页中。

所以我的问题是......我如何阅读这个页面并很好地格式化数据(也许我可以打印一个数组?)以便我将来可以使用它?

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    您的代码中有以下内容:

    foreach($json as $item->display_name)    
    

    这是不正确的,不会做你想做的事。正如您通过print_r($json) 看到的那样,名称在$json-&gt;AGENT-&gt;agents 中,因此您需要遍历这些项目,然后使用箭头语法($item-&gt;display_name)遍历display_name。获得显示名称后,您可以将其推送到数组中,然后根据需要使用它。

    您的循环应如下所示:

    $names = array(); // initialize empty array
    foreach($json->AGENT->agents as $item)
    {
        $names[] = $item->display_name;
    }
    
    print_r($names); // see the array contents
    

    输出:

    Array
    (
        [0] => Alex
        [1] => Bill
        [2] => Carrie
        [3] => David
    )
    

    Demo.

    注意:如果您事先不知道 JSON 对象的结构,则可以使用嵌套的 foreach 循环来检索名称。

    【讨论】:

    • 谢谢阿迈勒。现在这绝对是朝着正确的方向发展。如果可以的话,另一个快速的问题......我认为根据它们在 JSON 中的状态为代码名称着色会很酷。我可以更改 JSON 解码来存储状态,但如何最好地将名称和状态联系在一起以显示数据?
    • @Fairplay89:这是一个不同的问题(我认为超出了这个答案的范围)。您能否将其作为一个新问题发布并更详细地解释您要做什么? :)
    • 对不起...只是大声集思广益。让我在破坏木板之前自己进行一些挖掘。谢谢!
    • @Fairplay89:这是个好主意。阅读this meta post :)
    【解决方案2】:

    您要迭代的数组是$json-&gt;AGENT-&gt;agents。另外,您的foreach 语法错误。

    试试:

    foreach($json->AGENT->agents as $item)
    {
            echo $item->display_name;
    }
    

    【讨论】:

      【解决方案3】:

      如果您想将 JSON 数据作为数组而不是对象获取,请改用 json_decode($json, true)。这告诉函数将其作为关联数组返回,您可以在此处阅读:http://php.net/manual/en/function.json-decode.php

      【讨论】:

        【解决方案4】:

        您的 foreach 循环中有错误。

        foreach($json as $item->display_name)
            {
                    echo $item->agents->display_name;
            }
        

        $item 不是对象,您实际上是在尝试在这一行中访问无对象 ($item) 的属性“display_name”

        foreach($json as $item)
        

        【讨论】:

        • @iambriansreed 指出这样的错误通常足以让 OP 了解问题所在以及如何解决问题。当然不值得投反对票。
        • @GolezTrol 我同意,不值得投反对票,这就是我不投反对票的原因。
        猜你喜欢
        • 2018-03-13
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        相关资源
        最近更新 更多