Курси валют і банківських металів

Скрипт PHP отримує дані з сайту bank.gov.ua і зберігає їх локально у файлі nbu.json. Оновлення здійснюється кожні три години, щоб уникнути навантаження на джерело інформації.

    Дані успішно збережені у файл nbu.json.

    Вивід в строку

    USD (Долар США) коштує 41.3426 грн згідно з курсом НБУ на 04.04.2025.

    Вивід в Grid

    Валюта:
    Долар США
    Код:
    USD
    Курс до ₴:
    41.3426
    Дата:
    04.04.2025

    Метали за 1 грам згідно з курсом НБУ

    • Золото (XAU) коштує 4112.46 грн на 04.04.2025
    • Срібло (XAG) коштує 43.16 грн на 04.04.2025
    • Платина (XPT) коштує 1280.48 грн на 04.04.2025
    • Паладій (XPD) коштує 1276.08 грн на 04.04.2025

    Опис роботи скрипта

    Робоий код приведений нижче, для того, щоби скопіювати його, наведіться мишкою і кланціть лівою кнопкою.

    <!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-2 {
                display: grid;
                grid-template-columns: auto auto;
                gap: 5px;
            }
            .grid-table-2 div {
                padding: 0;
            }
            .grid-table-2 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>
                    <ul id="toc-list"></ul>
                    <?php
                    $file_path = 'nbu.json';
                    
                    if (!file_exists($file_path) || (time() - filemtime($file_path)) >= 10800) {
                        $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);
                    
                    function getCurs($array, $val) {
                        foreach ($array as $value) {
                            if ($value['cc'] == $val) {
                                return $value;
                            }
                        }
                        return null;
                    }
                    
                    $arr = getCurs($data, 'USD');
                    if ($arr) {
                        echo "
                        <h2>Вивід в строку</h2>
                        <p class='t-italic'>{$arr['cc']} ({$arr['txt']}) коштує {$arr['rate']} грн згідно з курсом НБУ на {$arr['exchangedate']}.</p>
                        <h2>Вивід в Grid</h2>
                        <div class='grid-table-2 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) {
                        $currency = getCurs($data, $cc);
                        if ($currency) {
                            $rate_per_gram = $currency['rate'] / 31.1035;
                            echo "<li>{$name} ({$cc}) коштує " . round($rate_per_gram, 2) . " грн на {$currency['exchangedate']}</li>";
                        }
                    }
                    echo "</ul>";
                    ?>
                </div>
            </div>
        </div>
        <script src="assets/js/theme.js?v=1.0"></script>
        <script src="assets/js/toclist.js?v=1.0"></script>
    </body>
    </html>