PHP从嵌套JSON数组中的第N个数组获取键和值

时间:2019-05-20 17:05:55

标签: php arrays json string sorting

我正在创建一个小部件,以使用免费API的JSON列表显示某公司的最新股价,该API每天更新一次。

我需要确定哪个密钥是最新密钥,并从该密钥内部获取收盘价。

这是API生成的JSON的示例:

{
    "Meta Data": {
        "1. Symbol": "GOOG",
        "2. Last Refreshed": "2019-05-20 11:52:41"
    },
    "Time Series (Daily)": {
        "2019-05-20": {
            "1. open": "1144.5000",
            "2. close": "1140.7700"
        },
        "2019-05-17": {
            "1. open": "1168.4700",
            "2. close": "1162.3000"
        },
        "2019-05-16": {
            "1. open": "1164.5100",
            "2. close": "1178.9800"
        }
    }
}

为了减少API调用,我将API的JSON输出保存到服务器上的文件中,并且每天更新一次。

我可以使用以下代码获取收盘价:

$json = 'jsonfile.json';
$json = json_decode($json, true);
echo $json['Time Series (Daily)']['2019-05-20']['2. close'];

但是我需要从JSON中获取中间键的值(日期)。

我以为我可以做这样的事情,但是我想这里的数字被视为字符串而不是数组位置:

echo $json[1][0][1];

我可以改用循环来忽略键名,从顶部获取第三个键的值,将其存储在变量中,并使用它来呼应收盘价:

$i = 0;
$dateKey = '';

foreach($json as $row) {
    foreach($row as $key => $val) {
        $i = $i + 1;
        $dateKey = $key;
        if ($i == 3) {
            break;
        }
    }
}

echo $json['Time Series (Daily)'][$dateKey]['2. close'];

但是,只有在最新价格始终位于最高价时,这才起作用。我以为会。。。但是我对JSON的了解还不够。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

对键(日期)进行反向排序,然后用reset选取第一个元素:

krsort($array['Time Series (Daily)']);
echo reset($array['Time Series (Daily)'])['2. close'];

您也可以使用key获取密钥(日期):

echo key($array['Time Series (Daily)']);

因此,如果您同时需要两者,只需先获取钥匙即可。

$date = key($array['Time Series (Daily)']);
echo $array['Time Series (Daily)'][$date]['2. close'];

相反,您可以使用end对最后一个进行排序和选择:

ksort($array['Time Series (Daily)']);
echo end($array['Time Series (Daily)'])['2. close'];

答案 1 :(得分:3)

元数据中有一个称为“上次刷新”的值。
前十个字符是最后一次刷新的日期,与时间序列中最新数据点的键相同。

因此,抓住前十个字符并使用它来获取最新值。

$latest = $arr["Time Series (Daily)"][substr($arr["Meta Data"]["2. Last Refreshed"],0,10)];

var_dump($latest);

输出:

array(2) {
  ["1. open"]=>
  string(9) "1144.5000"
  ["2. close"]=>
  string(9) "1140.7700"
}

https://3v4l.org/6AIOf

这意味着无需循环或排序array / json中的数据。

要仅获取收盘价,请使用:

$latestClose = $arr["Time Series (Daily)"][substr($arr["Meta Data"]["2. Last Refreshed"],0,10)]["2. close"];