PHP json_decode解析特定对象/段

时间:2014-03-05 18:31:50

标签: php json

我有一个json文件,我正在读取网址的内容。我想只解析一个特定的对象/段,单独存储然后显示它。

.Json
    {
    "playerstats": {
        "id": "adwawdawdawdawd",
        "game": "123324234",
        "stats": [
            {
                "name": "tk",
                "value": 57656
            },
            {
                "name": "td",
                "value": 38439
            },
            {
                "name": "ttp",
                "value": 2659434
            },
            {
                "name": "tpb",
                "value": 847
            },
            ]
        "achievements": [
            {
                "name": "wbp",
                "achieved": 1
            },
            {
                "name": "bpl",
                "achieved": 1
            },
            {
                "name": "bdl",
                "achieved": 1
            },
            {
                "name": "kel",
                "achieved": 1
            }
]
}
}

所以我想要一个单独的“Stats”数组和一个用于“成就”的独立数组。

然后我可以循环并得到像这样的输出

Stats: name, value
       name, value
       name, value
       ...

Achievements: name, achieved
              name, achieved
              name, achieved
              ...

.PHP Attempt

   $url = "insertjsonUrlHere";
   $jsonFile = file_get_contents($url);
   $obj = json_decode($jsonFile, true);
   $stats = $obj->playerstats->stats;
   $achievements = $obj->playerstats->achievements;

   foreach ($stats as $key => $value) {
     echo $key."  ".$value."<br />";
   }
   foreach ($achievements as $key => $value) {
      echo $key."  ".$value."<br />";
   }

3 个答案:

答案 0 :(得分:1)

您的JSON格式不正确。测试您的JSON Here(它显示格式错误的行) 如果未正确形成JSON文件,则json_decode将返回NULL

在更正您的JSON之后,此PHP代码按预期工作 -

$url = "insertjsonUrlHere";
$jsonFile = file_get_contents($url);
$obj = json_decode($jsonFile, true);
$stats = $obj['playerstats']['stats'];
$achievements = $obj['playerstats']['achievements'];
foreach ($stats as $v) {
    echo $v['name']."  ".$v['value']."<br />";
}
foreach ($achievements as $v) {
    echo $v['name']."  ".$v['achieved']."<br />";
}
/*
    OUTPUT
*/
    tk 57656
    td 38439
    ttp 2659434
    tpb 847
    wbp 1
    bpl 1
    bdl 1
    kel 1

修改
如果要按名称访问$stat的值,则此函数应该起作用 -

function get_stats_value($stats, $name){
    foreach ($stats as $v) {
        if($v['name'] == $name){
            return $v['value'];
        }
    }
    return false;
}
$val = get_stats_value($stats, "tk");
var_dump($val);
//OUTPUT -> int 57656

答案 1 :(得分:0)

你正在使用带有'true'标志的json_decode,这意味着你得到一个数组而不是一个对象。因此,为了访问您的值,请将代码更改为以下内容:

$stats = $obj['playerstats']['stats'];
$achievements = $obj['playerstats']['achievements‘];

答案 2 :(得分:0)

看看这是否有效。你也许可以用array_walk做一个版本。

$stats = array();
foreach($obj->playerstats->stats as$a){
    $stats[$a['name']] = $a['value'];
}
$achievements = array();
foreach($obj->playerstats->achievements as $a){
    $achievements[$a['name']] = $a['achieved'];
}