Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]kalkulator liczb które sa w pętli
Forum PHP.pl > Forum > Przedszkole
adek-
Witam, mam w pliku XML zestaw wartosci i chcę z tego zrobić coś na wzór kalkulatora walut jaki jest na stronie Kalkulator. Wybierasz wartość USD i wpisujesz liczbę. Kalkulator ten najpierw pobiera dane z XML np USD i dzieli jego kupno=265 / jednostka=100, a dopiero póżniej mnoży z wartością wpisaną przez użytkownika. Zrobiłem tak i działa wszystko tylko dane kupno i jednostka, które to pobierają się wyłącznie jako ostatni rekord, a nie wg wybrania symbolu - czyli są jakby asynchroniczne smile.gif.

Baza XML
  1. <data><tabela>
  2. <item symbol="USD" jednostka="100" kupno="265"><![CDATA[pierwsza wartość]]></item>
  3. <item symbol="EUR" jednostka="100" kupno="420"><![CDATA[druga wartość]]></item>
  4. <item symbol="GBP" jednostka="1000" kupno="20"><![CDATA[trzecia wartość]]></item>
  5. </tabela></data>


i moja pętla, która wyświetla dane w polu select

  1. $data = simplexml_load_file('data.xml');
  2.  
  3. foreach($data -> tabela as $tabela){
  4. foreach($tabela -> item as $item){
  5. }
  6. }
  7. echo "<select name=\"symbol\">"; //zaczynam wartość pola select i poniżej robię tablicę z wartością symbol USD,GBP itd
  8. foreach($tabela -> item as $item){
  9. $array_xml = array($item);
  10. //przydzielam zmienne do wartości symbol, kupno, jednostka,chociaż nie wiem, czy nie lepiej posługiwać się $item['xxx']?
  11. $symbol = $item['symbol'];
  12. $kupno = $item['kupno'];
  13. $jednostka = $item['jednostka'];
  14. foreach($array_xml as $value_xml) {
  15. //poniżej option wyciąga mi wszystkie wartości z bazy do pola wyboru select
  16. echo "<option value=\"".$symbol."\">".$symbol."</option>";
  17. //poniżej miało by niby wykonywać się równanie które później było by wyrzucane poza tablicą jako wynik końcowy i wykonuje się ale zawsze z ostatnią wartością "kupno" w bazie - (nie powinno być $kupno[jakieś id])?
  18. $suma = $_POST['kwota'] * ($kupno / $jednostka);
  19. }
  20. }
  21. echo "</select>";
  22.  
  23. //chcę wyswietlić wartość jaka jest pod wybranym symbolem np USD, wyświetla zawsze wartość ostatniego rekordu jak w powyższym przypadku
  24. echo "   " .$kupno. "   " .$symbol; // Wiem, że jest poza tablicą i trzeba by było zrobić jakieś id, czy drugą tablicę? bo nie bardzo wiem co dokładnie.
  25. //zaczyna się pole do wprowadzania danych "kwota" ktróre też działa poprawnie
  26. echo "<form method=\"post\" action=\"index.php\">";
  27. echo "<input type=\"text\" name=\"kwota\" value=\"".$kwota."\" maxlength=\"6\" size=\"6\" />";
  28. echo "<input type=\"submit\" value=\"Wylicz\"/>";
  29.  
  30. print "<br>Wartość kupna<b> " .$suma. " </b>zł"; //pokazuje wartość sumy, ale tak jak mówie wartość wprowadzona komparowana jest zawsze z wartością ostatniego rekordu w bazie, niezależnie co wybiore w polu select


ot cały skrypt... wszystko działa, tylko po wybraniu z pola select nie wybiera mi wartości kupno i jednostka ;/ znacie jakieś na to rozwiązanie?


// przepraszam, ale edytowałem i zmieniłem zapytanie... nie chce robić kalkulatora walut, ale coś podobnego działającego na tej samej zasadzie... mówiąc o klakulatorze będzie łatwiej kojarzyć smile.gif no i trochę zapytanie zmniejszyłem bo za dużo chciałem naraz uzyskać i sam nie mogłem się rozczytać smile.gif
agapikok
wkleiłam te Twoje 2 pola do plików data.xml i index.php i faktycznie wszystko działa poza przypisywaniem tych zmiennych. Nie znam się tak dobrze, ale musiał byś chyba wprowadzić to wszystko do tablicy bo chyba wczytuje Ci się tylko jedna wartość w pętli, czyli $symbol... ale nie wiem czy mówię dobrze i nie wiem jak to zrobić, niech mnie ktoś poprawi jeśli źle kombinuje smile.gif
adek-
W zasadzie to chyba masz racię agapikok. Bo pole select wyświetla mi wszystkie wartości "symbol" (usd,gbp itd) i mogę wybrać jaką kolwiek z nich, a pole "kupno" i "jednostka" są tak jakby wyciągane jako ostanie z tablicy. Nie ma korelacji między tym co wybiorę w select z resztą tych dwóch wartości... jak by to można było zrobić? Czy coś na zasadzie
  1. if(isset($_GET['symbol'])) {
  2. $id = $_GET['symbol'];
  3. } else {
  4. $id = $_POST['symbol'];
  5. }
  6. if(!isset($_POST['submit'])) {
  7.  
  8. tutaj tablice i w nich np:
  9.  
  10. $suma = $_POST['kwota'] * ($kupno[$id] / $jednostka[$id]);
  11.  

jak można to zrobić żeby było synchronicznie? Proszę o radę, albo jakiś wzrór, bądź podobny wątek, bo nawet nie wiem jak szukać na internecie.
-Roger-
ostatnio natknąłem się na gotowych skryptach z internetu na takie kody, to wygląda jak tablica w tablicy o której mówisz.
  1. $this->sources = array(
  2. // Probably the most reliable place to get your rates from
  3. "fedreserveny"=>array(
  4. "name"=>"Jakaś nazwa",
  5. "url"=>"http://www.markets/FDStoXML.cfm?FEXdate=%Y%2D%m%2D%d%2000%3A00%3A00%2E0&FEXtime=1200",
  6. "sourcepage"=>"http://www.markest.com/noon.cfm",
  7. "notes"=>"Jakiś zlogan, notatka.",
  8. "parser"=>"reserveny"
  9. ),
  10.  
  11. );


i jeszcze takie coś
  1. function parse_fedreserveny($content) {
  2. $rates = false;
  3.  
  4. if (!preg_match_all("/<frbny:Series (.*?)>([\s\S]*?)<\/frbny:Series>/i",$content,$matches,PREG_SET_ORDER)) return false;
  5. foreach ($matches as $k=>$match) {
  6. ..... jakis kod
  7. list($country,$island) = $this->get_country(NULL,$unit);
  8. ..... jakis kod
  9. if (!$rate || !$island) continue;
  10. $rates[$island] = array(
  11. "date"=>$date,
  12. "unit"=>$unit,
  13. "country"=>$country,
  14. "vote"=>$vote
  15. );
  16. }
  17.  
  18. return $rates;
  19. }

są to jakieś kody wycięte ze środka i nie bardzo wiem o czym bo jestem początkującym, ale rozglądałem się za pewnymi rzeczami i akurat rzuciły mi się w oko po Twoim wątku. Może się przydadzą smile.gif
Fifi209
Masz, bo mi się nudziło
  1. <form method="post" action="index.php">
  2. <?php
  3.  
  4. $data = simplexml_load_file('data.xml');
  5. $temp = array();
  6.  
  7. echo '<select name="symbol">';
  8. foreach($data->tabela->item as $item) {
  9. $temp[(string) $item['symbol']] = array('jednostka' => (string) $item['jednostka'], 'kupno' => (string) $item['kupno']);
  10. echo '<option value="'.$item['symbol'].'">'.$item['symbol'].'</option>';
  11. }
  12. echo '</select>';
  13.  
  14. //chcę wyswietlić wartość jaka jest pod wybranym symbolem np USD, wyświetla zawsze wartość ostatniego rekordu jak w powyższym przypadku
  15. //zaczyna się pole do wprowadzania danych "kwota" ktróre też działa poprawnie
  16. echo '<input type="text" name="kwota" value="'.(!empty($_POST['kwota']) ? $_POST['kwota'] : '').'" maxlength="6" size="6" />';
  17. echo '<input name="submit" type="submit" value="Wylicz"/></form>';
  18.  
  19. if (!empty($_POST['submit'])) {
  20. $suma = 0;
  21.  
  22. $suma = $temp[$_POST['symbol']]['kupno'] / $temp[$_POST['symbol']]['jednostka'] * $_POST['kwota'];
  23.  
  24. print "<br>Wartość kupna<b> " .$suma. " </b>zł"; //pokazuje wartość sumy, ale tak jak mówie wartość wprowadzona komparowana jest zawsze z wartością ostatniego rekordu w bazie, niezależnie co wybiore w polu select
  25. }
  26.  
  27. ?>
adek-
Wow Fifi209 Twoja pomoc przekroczyła wszelkie moje oczekiwania. Dziękuję Ci bardzo i pomógł już do Ciebie leci.

Ja mam teraz takie pytanie, czy takie umieszczanie tablicy w tablicy jakoś się nazywa? Bo szukałem w google i nie znalazłem tutka z takim czymś ;/
Ale ku gwoli wyjaśnień
  1. $temp = array();
  2. $temp[(string) $item['symbol']]
tutaj tworzysz tablicę która jako ID będzie miała $item["symbol'] i wartościach string które są deklarowane poniżej w kolejnej tablicy
  1. = array('jednostka' => (string) $item['jednostka'], 'kupno' => (string) $item['kupno']);


Tutaj jeśli wartość kwota nie jest pusta ma pobrać pole kwota. Co daje takie zabezpieczenie zamiast użycia samego POST kwota w formularzu?
  1. (!empty($_POST['kwota']) ? $_POST['kwota'] : '')


Natomiast tutaj bo nie bardzo wiem, jeśli submit nie jest pusty/wciśnięty suma równa się 0?
  1. if (!empty($_POST['submit'])) {
  2. $suma = 0;

O to ostatnie pytam, bo zrobiłem sobie, żeby mi pokazywał przed sumą ogólną po przyciśnięciu submit wartość 1 waluta = w PLN (1 USD = 2.92 PLN)
  1. echo '<font color="123bef" size="1">1 '.$_POST['symbol'].' = '.$temp[$_POST['symbol']]['kupno'] / $temp[$_POST['symbol']]['jednostka'].' PLN</font><br> ';

i przy otwieraniu strony pierwszy raz wyskakuje mi błąd o dzieleniu przez zero, więc spróbowałem dać tam $suma=1, a nawet dopisałem żeby kwota nie była zerowa na starcie
  1. if(!isset($_POST['kwota']))
  2. {
  3. $_POST['kwota'] = 1;
  4. }

ale też nie pomogło, tzn w rubryczce "kwota" wyświetla się 1, ale samo się nie wczytuje... Czy da sie w jakiś prosty sposób zrobić tak, żeby ładowała się od razu przykładowa waluta w tym polu co dodałem(1 USD = 2.92 PLM), a po zmianie np z USD na GBP żeby automatycznie pokazał 1 GBP = X zł, czy to jest jakiś większy bajer z JS, czy innymi AJAXAMI?
Bo narazie zastąpiłem to if'em który to pokaże dopiero jeśli ktoś wciśnie submit, żeby w oczy nie raził błąd smile.gif

PS jeszcze raz bardzo dziękuję Fifi209!
Fifi209
Cytat(adek- @ 15.07.2011, 08:36:45 ) *
Ja mam teraz takie pytanie, czy takie umieszczanie tablicy w tablicy jakoś się nazywa?

Tablica wielowymiarowa.

Cytat(adek- @ 15.07.2011, 08:36:45 ) *
Tutaj jeśli wartość kwota nie jest pusta ma pobrać pole kwota. Co daje takie zabezpieczenie zamiast użycia samego POST kwota w formularzu?
  1. (!empty($_POST['kwota']) ? $_POST['kwota'] : '')

Nie będzie wyrzucał NOTICE.

Cytat(adek- @ 15.07.2011, 08:36:45 ) *
Natomiast tutaj bo nie bardzo wiem, jeśli submit nie jest pusty/wciśnięty suma równa się 0?
  1. if (!empty($_POST['submit'])) {
  2. $suma = 0;

Tak, sprawdzam czy submit został wysłany, potem przypisuję do $sumy zero, bo jak dobrze wiemy w informatyce zmienne się zeruje - taki dobry nawyk, przy okazji pozbywam się kolejnego NOTICE.
Cytat(adek- @ 15.07.2011, 08:36:45 ) *
, a po zmianie np z USD na GBP żeby automatycznie pokazał 1 GBP = X zł, czy to jest jakiś większy bajer z JS, czy innymi AJAXAMI?

No musiałbyś już pobierać ajaxem, skoro ma być dynamicznie.
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.