Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] przekształcanie elseif w switch/case
Forum PHP.pl > Forum > Przedszkole
Radek41
Witam,
zrobiłem taki banalny skrypt, który porównuje liczbę 600, zapisaną w zmiennej $aktualna ze wprowadzoną wartością $pkt i następnie pokazuje jak $aktualna się zmieniła.

Wygląda to tak

  1. <?
  2. $aktualna = 600;
  3. $pkt = $_POST['pkt'];
  4. $zmiana = $pkt - $aktualna;
  5. $suma = $aktualna + $zmiana;
  6.  
  7. if ($pkt == "") echo '';
  8. elseif ($pkt > $aktualna) echo 'Punktow '.$suma.' (<b><span style="color: green;">+'.$zmiana.'</span></b>).';
  9. elseif ($pkt < $aktualna) echo 'Punktow '.$suma.' (<b><span style="color: red;">'.$zmiana.'</span></b>).';
  10.  
  11. ?>


I wszystko dla mnie jest OK, osiągnąłem oczekiwany przeze mnie efekt.

Ale nurtuje mnie czy można to samo zapisać wykorzystując instrukcję warunkową switch/case.

Wykombinowałem coś takiego, co działa źle.

  1. <?
  2. $aktualna = 600;
  3. $pkt = $_POST['pkt'];
  4. $zmiana = $pkt - $aktualna;
  5. $suma = $aktualna + $zmiana;
  6.  
  7. switch ($pkt) {
  8. case $pkt == "":
  9. echo '';
  10. case $pkt > $aktualna:
  11. echo 'Punktow '.$suma.' (<b><span style="color: green;">+'.$zmiana.'</span></b>).';
  12. case $pkt < $aktualna:
  13. echo 'Punktow '.$suma.' (<b><span style="color: red;">'.$zmiana.'</span></b>).';
  14. }
  15. ?>



I teraz moje pytanie - czy powyższą instrukcję zapisaną za pomocą elseif można w jakiś sposób zapisać wykorzystując switch/case? A jeśli tak, to w jaki sposób poprawić to co napisałem wyżej?

Dziękuję z góry,
Pozdrawiam
Blame
Bo sprawdzanie w case musisz umieścić w nawiasach, tzn.
  1. case ($pkt > $aktualna):
Radek41
Cytat(Blame @ 30.01.2010, 18:58:05 ) *
Bo sprawdzanie w case musisz umieścić w nawiasach, tzn.
  1. case ($pkt > $aktualna):


Mimo wszystko, podczas gdy używając if i nic nie wprowadzając do formularza ($pkt), nic się nie wyświetla

- zgodnie z
  1. if ($pkt == "") echo '';


to używając switch/case, pokazuje się "Punktow 0 (+-600).Punktow 0 (-600)." naraz, czyli omija nie tylko:

  1. case ($pkt == ""):


Ale także źle interpretuje pozostałe warunki.
Blame
No ale ja mimo wszystko poszedłbym w stronę zoptymalizowania if a nie przerabiania tego na switch bo to IMHO jest bez sensu.
Ja bym to zrobił tak:
  1. <?
  2. $aktualna = 600;
  3. if (!empty($_POST['pkt']){ //1
  4. $pkt = $_POST['pkt'];
  5. $zmiana = $pkt - $aktualna;
  6. $suma = $aktualna + $zmiana;
  7.  
  8. if ($pkt > $aktualna) echo 'Punktow '.$suma.' (<b><span style="color: green;">+'.$zmiana.'</span></b>).';
  9. elseif ($pkt < $aktualna) echo 'Punktow '.$suma.' (<b><span style="color: red;">'.$zmiana.'</span></b>).';
  10. }
  11. else{ //2
  12. }
  13. ?>

Na tę chwilę wydaje mi się to najprostszym rozwiązaniem.
1. Sprawdzamy czy $_POST['pkt'] nie jest puste. Jeśli tak to robimy sprawdzenie.
2. Tu wrzucamy kod który się wykona gdy jednak będzie.
Radek41
Dzięki za kod, napewno z niego skorzystam. smile.gif

Nawet nie chciałem korzystać ze switch/case, intryguje mnie tylko, czy da się to w ten sposób zapisać. tongue.gif
Fifi209
A umiecie używać switch ?

  1. switch($zmienna) {
  2.  
  3. case 'wartosc':
  4. // czynnosc
  5. break;
  6.  
  7. default:
  8. // domyslnie
  9. break;
  10. }


Druga sprawa:
  1. if ($pkt == "") echo '';


A empty ?

Ogólnie:
  1.  
  2. if (!empty($pkt)) {
  3. if ($pkt > $aktualna) {
  4. // wieksza
  5. }else{
  6. // mniejsza
  7. }
  8. }else{
  9. //pusto
  10. }


Blame
No wszystko fajnie tylko twój skrypt z if'ami nie uwzględnia jednej, chyba najważniejszej rzeczy a mianowicie:
Cytat(Radek41 @ 30.01.2010, 18:11:05 ) *
[...]i następnie pokazuje jak $aktualna się zmieniła.

bo else wykona się nawet jak będą identyczne, więc i tak trzeba dodać jeszcze jeden warunek. Można by pokombinować z operatorem różności "<>" ale z tego co widzę to autor chce uzyskać różny kolor w zależności czy $aktualna jest mniejsza czy większa.
Radek41
Cytat(Blame @ 31.01.2010, 08:59:36 ) *
No wszystko fajnie tylko twój skrypt z if'ami nie uwzględnia jednej, chyba najważniejszej rzeczy a mianowicie:

bo else wykona się nawet jak będą identyczne, więc i tak trzeba dodać jeszcze jeden warunek. Można by pokombinować z operatorem różności "<>" ale z tego co widzę to autor chce uzyskać różny kolor w zależności czy $aktualna jest mniejsza czy większa.


Dodałem już to wcześniej, tutaj wstawiłem troszkę skrócony kod. winksmiley.jpg

Mimo wszystko dziękuję za zwrócenie na to uwagi.
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.