Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [klasa][php5] kursy walut z NBP
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
czachor
Witam,
potrzebowałem klasy do wyciągania kursów walut z NBP, znalazłem klasę napisaną przez @stanik_jr, ale nie wiem czemu nie działa mi pomimo usilnej walki winksmiley.jpg Dlatego na szybko stworzyłem coś takiego...

16.11.2007 - drobna poprawka

  1. <?php
  2. /**
  3.  * Pobierane kursów walut ze strony NBP
  4.  * @author Czachor <czahor[at]gmail[dot]com>
  5.  */
  6.  
  7. class NBPExchange
  8. {
  9. /**
  10.  * ścieżka do pliku XML z kursami walut
  11.  * @var str
  12.  */
  13. public static $sXmlURL = 'http://nbp.pl/kursy/xml/';
  14.  
  15. /**
  16.  * nazwa pliku zawirającego dane o plikach XML
  17.  * @var str
  18.  */
  19. public static $xDirContentFile = 'dir.txt';
  20.  
  21. /**
  22.  * przechowuje nazwę aktualnego pliku XML
  23.  * @var str
  24.  */
  25. public $todayXMLFile = null;
  26.  
  27. /**
  28.  * przechowuje dane walut wg kodu waluty
  29.  * @var array
  30.  */
  31. public $currency = array();
  32.  
  33. /**
  34.  * przechowuje dane walut wg nazwy kraju
  35.  * @var array
  36.  */
  37. public $currencyByCountry = array();
  38.  
  39.  
  40. function __construct()
  41. {
  42. $this->getTodayXML();
  43. $this->createCurrencyArray();
  44. }
  45.  
  46.  
  47. /**
  48.  * pobiera nazwę aktualnego pliku XML z kursami walut
  49.  */
  50. private function getTodayXML()
  51. {
  52. $remoteDirInfo = @file_get_contents(self::$sXmlURL . self::$xDirContentFile);
  53.  
  54. if ($remoteDirInfo === false)
  55. {
  56. echo 'Błąd podczas otwierania zdalnego pliku z informacją o katalogu! System przerwał pracę.';
  57. return false;
  58. };
  59.  
  60. $remoteDirInfo = explode("r\n", $remoteDirInfo);
  61. //usunięcie ostatniego pustego elementu tablicy, jeśli tego nie będzie, pojawi się
  62. //"Notice: Uninitialized string offset: 0"
  63. array_pop($remoteDirInfo);
  64.  
  65. //wyszukiwanie elementów z 'c' ("Tabela kursów średnich walut obcych")
  66. $this->todayXMLFile = array_pop(array_filter($remoteDirInfo, array($this, 'searchB')));
  67. }
  68.  
  69.  
  70. /**
  71.  * funkcja zwrotna wywoływana przez array_filter w $this->getTodayXML()
  72.  * wyszukuje wszystkie elementy, w których pierwsza litera to "b" (oznaczenie NBP dla
  73.  * plików XML zawierających "Tabelę kursów średnich walut obcych"
  74.  * @param str $data
  75.  * @return str
  76.  */
  77. private function searchB($data)
  78. {
  79. if ($data{0} == 'b')
  80. {
  81. return $data;
  82. };
  83. }
  84.  
  85.  
  86. /**
  87.  * tworzy tablice z danymi walut
  88.  */
  89. private function createCurrencyArray()
  90. {
  91. $xml = simplexml_load_file(self::$sXmlURL . $this->todayXMLFile . '.xml');
  92.  
  93. foreach($xml->pozycja as $pozycja => $pozData)
  94. {
  95. $this->currency[(string) $pozData->kod_waluty] = $pozData;
  96. $this->currencyByCountry[(string) $pozData->nazwa_kraju] = $pozData;
  97. };
  98. }
  99. };
  100.  
  101.  
  102. //przykład użycia
  103. $info = new NBPExchange();
  104.  
  105. // ALL (Albania): 2,9803
  106. echo 'ALL (' . $info->currency['ALL']->nazwa_kraju . '): ' . $info->currency['ALL']->kurs_sredni . '<br />';
  107.  
  108. // Angola (AOA): 0,0331
  109. echo 'Angola (' . $info->currencyByCountry['Angola']->kod_waluty . '): ' . $info->currencyByCountry['Angola']->kurs_sredni;
  110.  
  111. /* SimpleXMLElement Object
  112. (
  113. [nazwa_kraju] => Albania
  114. [nazwa_waluty] => lek
  115. [przelicznik] => 100
  116. [kod_waluty] => ALL
  117. [kurs_sredni] => 2,9803
  118. ) */
  119. print_r($info->currency['ALL']);
  120. ?>


Wszystkie uwagi mile widziane smile.gif
GrayHat
jeszcze jakies zabezpieczenie typu try/catch i bedzie znosne winksmiley.jpg
czachor
Hmm. Mógłby ktoś mi powiedzieć, czemu wyskakuje mi taki błąd?
Strict Standards: Only variables should be passed by reference in home/fwid/ftp/libs/currencyExchangeNBP.class.php on line 85 (linia 85 to tutaj 67).

Wydaje mi się, że wszystko jest ok, ale coś jednak nie...
loozaque
Cytat(czachor @ 16.11.2007, 21:32:48 ) *
Hmm. Mógłby ktoś mi powiedzieć, czemu wyskakuje mi taki błąd?
Strict Standards: Only variables should be passed by reference in home/fwid/ftp/libs/currencyExchangeNBP.class.php on line 85 (linia 85 to tutaj 67).

Wydaje mi się, że wszystko jest ok, ale coś jednak nie...


Zamień:
$this->todayXMLFile = array_pop(array_filter($remoteDirInfo, array($this, 'searchB')));

Na:
$aFilename = array_filter($remoteDirInfo, array($this, 'searchB'));
$this->todayXMLFile = array_pop($aFilename);
nastybig
A jak do tego dorobić skrypcik który wyciągnie w jakiejś pętli wszystkie kursy ?
Piotr1
Cytat(nastybig @ 23.02.2009, 16:04:59 ) *
A jak do tego dorobić skrypcik który wyciągnie w jakiejś pętli wszystkie kursy ?


  1. <meta charset="utf8" />
  2.  
  3. <?php
  4. include('classes/nbp.php');
  5. //przykład użycia
  6. $info = new NBPExchange();
  7.  
  8. foreach($info->currency as $name => $value) {
  9.  echo '<span style="font-weight: bold">' . $value -> kod_waluty . ' (' . $value -> nazwa_kraju . ')</span><br />';
  10.  echo '1 ' . $value -> nazwa_waluty . ' = ' . $value->kurs_sredni . ' zł<br /><br />';
  11. }
  12.  
  13. ?>
m227
Zrobiłem coś takiego, zapraszam, może się przyda:

http://e-storm.pl/kursy/

Pozdrawiam, m227
m-naw
Nie lepiej trzymać się nazewnictwa w jednym języku?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.