Kurzovní lístek

Publikováno v sekci PHP v Neděli 13.1.2008 - 22:08

Pokud potřebujete mít na svých webových stránkách aktuální kurzovní lístek, není nic snažšího než si přečíst tento článek.

K získání kurzovního lístku použijeme textový výpis České národní banky. Kurzovní lístek stáhneme dvakrát. Jednou za dnešní datum, podruhé za včerejší. Porovnáme rozdíl kurzů a pak jej přehledně vypíšeme do tabulky. Abychom tuto akci neprováděli zbytečně po každém obnovení stránky, tak si data kešujeme do souboru.

class Kurzy
{
 var $kesLimit = 3600; // 1 hodina

function Kurzy()
{
 echo $this->spust();
}


function spust()
{
  $this->kesovat();
}

function ziskejKurz($url)
{

$soubor = file($url);
$i = 0;
$kurzPole = array();
foreach ($soubor as $row)
{
 $i++;
 if ($i > 2)
 {  
   $row = trim($row);
   list($zeme, $mena, $mnozstvi, $kod, $kurz) = explode("|", $row);
   $kurzPole[$zeme] = array($zeme, $mena, $mnozstvi, $kod, $kurz);
 }
}

  return $kurzPole;
}




function porovnejData()
{

  $dnesniDatum = date("d.m.Y");
  $vcerejsiDatum = date("d.m.Y", mktime (0,0,0, date("m"), date("d") - 3,date("Y")));

  
  $dnes  = $this->ziskejKurz("http://www.cnb.cz/www.cnb.cz/cz/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=$dnesniDatum");
  $vcera  = $this->ziskejKurz("http://www.cnb.cz/www.cnb.cz/cz/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt?date=$vcerejsiDatum");


  $finalData = array();
  foreach ($dnes as $zeme => $pole)
  {
    // nastaveni sipky 
    if ($dnes[$zeme][4] > $vcera[$zeme][4])
      $ico = "<img src='up.gif' />";
    elseif  ($dnes[$zeme][4] < $vcera[$zeme][4])
      $ico = "<img src='down.gif' />";
    else
       $ico = "";
      
    // vypocet ceny a pretypovani   
      $cenaDnes =  (double)str_replace(",", ".", $dnes[$zeme][4]);
      $cenaVcera =  (double)str_replace(",", ".", $vcera[$zeme][4]);
     
      $rozdil = $cenaDnes - $cenaVcera;
  
  
     
     //země|měna|množství|kód|kurz
     // finalni ulozeni rozdilovych dat
     $finalData[$dnes[$zeme][0]] = array(
                        "zeme" => $dnes[$zeme][0],
                        "mena" => $dnes[$zeme][1],
                        "mnozstvi" => $dnes[$zeme][2],
                        "kod" =>  $dnes[$zeme][3],
                        "kurz" => $dnes[$zeme][4],
                        "sipka" => $ico,
                        "rozdil" => $rozdil
                       );
}
   return $finalData;
}

function vykreslitTabulku()
{
  $table  = "<table border='1'>";
  $table .= "<tr>
            <th>Země</th>
            <th>Měna</th>
            <th>Množství</th>
            <th>Kód</th>
            <th>Kurz</th>
            <th>Ico</th>
            <th>Rozdíl</th>
            </tr>
           ";
  
     
  foreach ($pole = $this->porovnejData() as $klic => $index)
  {

    $table .= "<tr>
              <td>".$pole[$klic]["zeme"]."</td>
              <td>".$pole[$klic]["mena"]."</td>
              <td>".$pole[$klic]["mnozstvi"]."</td>
              <td>".$pole[$klic]["kod"]."</td>
              <td>".$pole[$klic]["kurz"]."</td>
              <td>".$pole[$klic]["sipka"]."</td>
              <td>".$pole[$klic]["rozdil"]."</td>
              </tr>
             ";
  }         
  $table .= "</table>";
  
  return $table;
}

  
 function kesovat()
 {
   if (!is_file("kurzovni-listek.html") or fileMtime("kurzovni-listek.html") < (time() - $this->kesLimit))
   {
     $file = fopen("kurzovni-listek.html", "w+");
     fwrite($file, $this->vykreslitTabulku());
     fclose($file);
     
     readfile("kurzovni-listek.html");
     
   }
   else
   { 

     readfile("kurzovni-listek.html");
   }
 } 

Mno a třídu použijeme takto

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Kurzovní lístek</title>
  </head>
  <body>

<?php
  include("kurzy.php");
  echo '<h2>Kurzovní lístek</h2>';
  $k = new Kurzy();
?>
  </body>
</html>

Na ukázku výpisu kurzovního listku se můžete podívat zde

Soubor ke stažení (kurzovni-listek.zip)

6 komentářů « Zpět


Komentáře

reagovat #1 kuba:
29.03.08 17:35
ahoj, jak prosímte udělám z toho tvého scriptu aby se mi vypsaly jen některé měny? dík
reagovat #2 Roman Janko: (Administrátor) admin@rjwebdesign.net
31.03.08 20:25
[1] kuba Snadno, staci si nadefinovat pole men ktere chces zobrazit, a potom to zohlednit v metode ktera bud data ziskava ( ziskas jen ty ktere chces ) nebo ktera je vykresluje ...
reagovat #3 kuba:
01.04.08 18:57
[2] Roman Jankojo dík, už jsem to vyřešil, sice ne přes pole, ale trošku kostrbatě přes číslo řádku měny
reagovat #4 Roman Janko: (Administrátor) admin@rjwebdesign.net
02.04.08 19:30
[3] kuba To bych nedelal, kdyby zmenili treba razeni men a napr. EURO by se z radku 5 presunulo na radek 8 tak by ti to nevyslo .. zkus to pres to pole, bude to univerzalnejsi
reagovat #5 Milan:
04.06.10 17:52
Ahoj taky jsem si s timhle hral, sipecky teda neumi ale za to si myslim ze ma hodne veci navic :)
addons.nette.org/cs/cnb funguje i bez Nette frameworku
reagovat #6 Roman Janko: (Administrátor) admin@rjwebdesign.net
05.06.10 20:31
[5] Milan Tak to rozhodne, je to napsane mnohem lepe a ma to mnohem vice funkcionality :), ten muj skript byla rychlovka na 20 min a je to stare 1,5 roku , podle toho to taky vypada :)

U tveho bude mit mozna zacatecnik trosku problem se v tom zorientovat, je k tomu pribaleno moc trid ... jinak je to pekne co jsem koukal.

Přidat komentář

Nový vzkaz

* Tato pole jsou povinná, [smajlíci]

  • na jiné komentáře odkazujte pomocí odkazu reagovat
  • vaše IP adresa bude zaznamenána
  • používají se gravatary
  • můžeme si tykat
  • HTML tagy vypnuty. PHP kód se také neprovede. Pokud potřebuju přiložit ukázku vašeho kódu, použijete službu pastebin, nebo jej vložte mezi značky [code] [/code]
  • vulgární, rasistické či jinak nepřípustné komentáře budou smazány