Скрипт PHP отримує дані з сайту bank.gov.ua і зберігає їх на локально у файлі nbu.json. Оновлення здійснюється на сервері кожні три години, для того, щоби уникнути навантаження на джерело інформації.
Дані успішно збережені у файл nbu.json.
Вивід в строку
USD (Долар США) коштує 42.1257 грн згідно з курсом НБУ на 20.01.2025.
Вивід в Grid
Валюта:
Долар США
Код:
USD
Курс до ₴:
42.1257
Дата:
20.01.2025
Метали за 1 грам згідно з курсом НБУ
Золото (XAU) коштує 3672.04 грн на 20.01.2025
Срібло (XAG) коштує 41.29 грн на 20.01.2025
Платина (XPT) коштує 1283.67 грн на 20.01.2025
Паладій (XPD) коштує 1281.56 грн на 20.01.2025
Для перегляду коду поточної сторінки - натисніть кнопку нижче. Код робочий і може бути використаний за потреби будь-де з бажаним CSS.
<!DOCTYPE html>
<html lang="uk">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Курси НБУ</title>
<link rel="stylesheet" href="assets/css/berry.css">
<link rel="stylesheet" href="assets/css/theme.css">
<style>
.grid-table {
display: grid;
grid-template-columns: auto auto;
gap: 5px;
}
.grid-table div {
padding: 0;
}
.grid-table div:nth-child(odd) {
font-weight: bold;
}
</style>
</head>
<body class="dark-theme">
<div class="layout-center-wrap">
<div class="layout-wrap">
<div class="w800px-max b-center">
<h1>Курси валют і банківських металів</h1>
<p class="secondary">Скрипт PHP отримує дані з сайту <a href="https://bank.gov.ua">bank.gov.ua</a> і зберігає їх на локально у файлі <code>nbu.json</code>. Оновлення здійснюється на сервері кожні три години, для того, щоби уникнути навантаження на джерело інформації.</p>
<?php
// Шлях до файлу
$file_path = 'nbu.json';
// Перевірка існування файлу та часу його останнього змінення
if (!file_exists($file_path) || (time() - filemtime($file_path)) >= 10800) {
// Отримання даних через CURL
$ch = curl_init('https://bank.gov.ua/NBUStatService/v1/statdirectory/exchange?json');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
// Виконання запиту та запис у файл
$html = curl_exec($ch);
curl_close($ch);
if ($html !== false) {
file_put_contents($file_path, $html);
echo "Дані успішно збережені у файл nbu.json.";
} else {
echo "Не вдалося отримати дані з API.";
}
}
// Читання даних з файлу
$json_data = file_get_contents($file_path);
$data = json_decode($json_data, true);
// Виведення курсу USD
$arr = getCurs($data, 'USD');
echo "
<h2>Вивід в строку</h2>
<p class='t-italic'>{$arr['cc']} ({$arr['txt']}) коштує {$arr['rate']} грн згідно з курсом НБУ на {$arr['exchangedate']}.</p>
<h2>Вивід в Grid</h2>
<div class='grid-table card'>
<div>Валюта:</div>
<div>{$arr['txt']}</div>
<div>Код:</div>
<div>{$arr['cc']}</div>
<div>Курс до ₴:</div>
<div>{$arr['rate']}</div>
<div>Дата:</div>
<div>{$arr['exchangedate']}</div>
</div>";
// Виведення даних про дорогоцінні метали
echo "<h2>Метали за 1 грам згідно з курсом НБУ</h2><ul class='t-italic'>";
$metals = ['XAU' => 'Золото', 'XAG' => 'Срібло', 'XPT' => 'Платина', 'XPD' => 'Паладій'];
foreach ($metals as $cc => $name) {
foreach ($data as $currency) {
if ($currency['cc'] == $cc) {
$rate_per_ounce = $currency['rate'];
$rate_per_gram = $rate_per_ounce / 31.1035;
echo "<li>{$name} ({$cc}) коштує " . round($rate_per_gram, 2) . " грн на {$currency['exchangedate']}</li>";
break;
}
}
}
echo "</ul>";
// Виведення результату у вигляді масиву
if ($data !== null) {
echo "<h2>Вивід файла JSON у масив</h2><pre class='card'>";
print_r($data);
echo "</pre>";
}
// Функція для отримання курсу валюти
function getCurs($array, $val) {
foreach ($array as $key => $value) {
if ($value['cc'] == $val) {
return $value;
}
}
}
?>
</div>
</div>
</div>
</body>
</html>