繁体   English   中英

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

[英]PHP get keys and values from Nth array in a nested JSON array

我正在创建一个小部件,以使用免费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的了解还不够。

有一个更好的方法吗?

对键(日期)进行反向排序,然后选择带有reset的fist元素:

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'];

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

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

$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"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM