Как получить официальные курсы валют на заданную дату на PHP
В интернете немало скриптов, которые показываю курсы валют. Но мне нужен был курс доллара и евро от центрального банка. Я решил поискать скрипты, которые покажут официальные курсы валют на заданную дату. Я наткнулся на интересную статью jQuery сортировка таблицы. Там в скрипте "PHP парсер курсов валют" грабится xml-документ с помощью регулярных выражений. В ограблении кода активно используются регулярные выражения. Скрипт классно работает, но имеет свои особенности. Он выводит таблицу в HTML с большим количеством валют. Мне нужно сформировать из таблицы с курсами валют массив JSON. Этот массив подобен колбасе. Именно так называют программисты подобный массив. Бывают очень большие колбасы в большом количестве )))
/*
* getArr()
* курсы валют от центрального банка
* происходит парсинг xml-документа
* */
function getArr()
{
$url = 'http://www.cbr.ru/scripts/XML_daily.asp?date_req='.
date('d/m/Y',strtotime("+0 day"));
$cbr_xml = str_replace(array("\n","\r","\t"),"",getContentPage($url));
if(preg_match_all('~(.*?)~i',$cbr_xml,$Valute))
{
foreach($Valute[1] as $data)
{
preg_match('~(.*?) ~i',$data,$CharCode);
preg_match('~(.*?) ~i',$data,$NumCode);
$arr[$CharCode[1]]['num_code'].= $NumCode[1];
preg_match('~(.*?) ~i',$data,$Nominal);
$arr[$CharCode[1]]['nominal'] = $Nominal[1] ;
preg_match('~(.*?) ~i',$data,$Name);
$arr[$CharCode[1]]['name'].= toUtf8($Name[1]);
preg_match('~(.*?) ~i',$data,$Value);
$arr[$CharCode[1]]['value'].= $Value[1];
$i++;
}
return $arr;
}
}
function getContentPage($url)
{
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
$text = curl_exec($c);
curl_close($c);
return $text;
}
//кодируем в Utf8
function toUtf8($str)
{
return mb_convert_encoding($str, "utf-8", "windows-1251");
}
$arr = getArr();
echo json_encode($arr);
/*
{
"EUR":{"num_code":"978",
"nominal":"1",
"name":"\u0415\u0432\u0440\u043e",
"value":"63,6090"},
"USD":{"num_code":"840",
"nominal":"1",
"name":"\u0414\u043e\u043b\u043b\u0430\u0440
\u0421\u0428\u0410",
"value":"58,0374"}
}*/
Вы можете просмотреть как сегодняшний курс валюты, так и курс за вчерашний день. Функция strtotime("+0 day") позволяет менять время. Конечно сколько нулей не плюсуй все равно значение переменной не изменится. Я оставил эту часть кода для того чтобы в любой момент можно было изменить время. Мне пришлось немного переделать массив. Я использовал переменную $CharCode[1] как ключ для массива. В моём большом массиве есть множество других массивов и обращаться к определённому массиву можно только по ключу (EUR). В моём случае переменная $CharCode[1] принимает следующие значения:
- AUD => Австралийский доллар
- AZN => Азербайджанский манат
- GBP => Фунт стерлингов Соединенного королевства
- AMD => Армянские драмы
- BYR => Белорусские рубли
- BGN => Болгарский лев
- BRL => Бразильский реал
- HUF => Венгерский форинт
- DKK => Датских крон
- USD => Доллар США
- EUR => Евро
- INR => Индийских рупий
- KZT => Казахстанских тенге
- CAD => Канадский доллар
- KGS => Киргизский сом
- CNY => Китайский юань
- MDL => Молдавских леев
- NOK => Норвежских крон
- PLN => Польский злотый
- RON => Новый румынский лей
- XDR => СДР (специальные права заимствования)
- SGD => Сингапурский доллар
- TJS => Таджикский сомони
- TRY => Турецкая лира
- TMT => Новый туркменский манат
- UZS => Узбекский сум
- UAH => Украинская гривна
- CZK => Чешских крон
- SEK => Шведских крон
- CHF => Швейцарский франк
- ZAR => Южноафриканский рэнд
- KRW => Вон Республики Корея
- JPY => Японская иена
Меня интересует только USD и EUR. Я не стал удалять из массива PHP остальные элементы. Пусть все курсы выводятся. Пользуйтесь моей версией скрипта и ссылайтесь на эту страницу на своих сайтах и форумах.