我正在创建一个小部件,以使用免费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的了解还不够。
有更好的方法吗?
答案 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"
}
这意味着无需循环或排序array / json中的数据。
要仅获取收盘价,请使用:
$latestClose = $arr["Time Series (Daily)"][substr($arr["Meta Data"]["2. Last Refreshed"],0,10)]["2. close"];