簡體   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