在php中解析多级json

时间:2017-07-25 18:28:59

标签: php arrays json

我有这个json文件,我想回来" host_name"所有项目的值。下面,我的PHP代码,我尝试了一些东西,使用true解码数组中的json或没有它并使用foreach(),但我无法做到。

{
    "href": "https://webservice:8080",
    "items": [
        {
            "Hosts": {
                "cluster_name": "cluster1",
                "host_name": "server1"
            },
            "href": "https://server1:8080"
        },
        {
            "Hosts": {
                "cluster_name": "cluster1",
                "host_name": "server2"
            },
            "href": "https://server2:8080"
        },
        {
            "Hosts": {
                "cluster_name": "cluster1",
                "host_name": "server3"
            },
            "href": "https://server3:8080"
        }
    ]
}

这是我的PHP代码。想尽可能简单。我的目标是使用json的最后一个值(' host_name')来显示所有这些值。

<?php
        $content = file_get_contents("test.json");
        $content = utf8_encode($content);
        $result = json_decode($content, true);
        var_dump($result);
        echo "<br><br><br>";

        #echo $result["items"]["Hosts"][0]["host_name"];

        foreach($result as $r) {
                echo $r['items']['Hosts']['cluster_name'].'<br>';
        }
?>

感谢。

4 个答案:

答案 0 :(得分:2)

你只是在错误的数组上循环,它应该是

foreach($result['items'] as $item) {
    echo $item['Hosts']['host_name'];
}

答案 1 :(得分:2)

$result需要$result['items']

foreach($result['items'] as $r) {
  echo $r['Hosts']['cluster_name'];
  echo PHP_EOL;
}

输出: - https://eval.in/837593

答案 2 :(得分:1)

如上所述,您正在遍历错误的数组。您也可以像这样遍历对象:

$obj = json_decode(utf8_encode(file_get_contents("test.json")));
foreach($obj->items as $item)
{
    var_dump($item->Hosts->host_name);
}

答案 3 :(得分:1)

只是为了显示替代方法,您可以使用array_column()implode()来省略将使用foreach循环方法显示的尾随<br>

代码:(Demo

$items=json_decode($json,true)['items'];
echo implode("<br>",array_column(array_column($items,'Hosts'),'host_name'));

输出:

server1<br>server2<br>server3