Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Instrukcja switch - obsługa and?
Forum PHP.pl > Forum > Przedszkole
Początkujący
Mam taki kod:
  1. <?php
  2. $godzina==125;
  3. switch ($godzina) {
  4. case "$godzina>0 and $godzina<14";
  5. echo "Dzień dobry!";
  6. break;
  7. case "$godzina>=14 and $godzina<18";
  8. echo "Dobrego popołudnia";
  9. break;
  10. case "$godzina>=18 and $godzina<=24";
  11. echo "dobry wieczór";
  12. break;
  13. default:
  14. echo "Ta godzina to zła godzina";
  15. }
  16.  
  17. ?>

No i niestety, gdy go skompiluję, wyświetla mi się kod: Dzień dobry, pomimo tego, że $godzina=125.
Co zrobiłem źle z tym kodem? A moze instrukcja switch nie obsługuje polecenia and?
wookieb
Do manuala
http://pl2.php.net/manual/en/control-structures.switch.php
http://pl2.php.net/manual/en/control-structures.if.php

Bo to co masz wynika z twoich braków z wiedzy opisanej w byle jakim podstawowym kursie.
Początkujący
Dopiero co zacząłem uczyć się php.
Przerabiam lekcję dotyczącą switcha i postanowiłem zrobić własny kod na podstawie zdobytej wiedzy. Dotychczas nigdy nie korzystałem z manuala, a teraz nie znalazłem w nim interesującej informacji.
Wiem, że za pomocą funkcji if mógłbym to zrobić, ale chcę po prostu zobaczyć, jak można to zrobić za pomocą funkcji switch.
Bo chyba nie trzeba wpisywać kilkadziesiąt razy case z kolejnymi godzinami, żeby funkcja switch działała prawidłowo?

Edycja: teraz działa, wystarczyło usunąć breaki winksmiley.jpg
wookieb
Cytat(Początkujący @ 27.08.2010, 16:28:30 ) *
Edycja: teraz działa, wystarczyło usunąć breaki winksmiley.jpg

Breaki nie mają z tym nic wspólnego.
minolone
Witam. Rozwiązanie troche inne, lecz działa.
  1. <?php
  2. $godzina = 4;
  3.  
  4. if ( $godzina > 0 && $godzina < 14 )
  5. {
  6. echo 'Dzień dobry!';
  7. }elseif( $godzina >= 14 && $godzina < 18 )
  8. {
  9. echo 'Dobrego popołudnia';
  10. }elseif ( $godzina >= 18 && $godzina <= 24 )
  11. {
  12. echo 'Dobry wieczór';
  13. }else
  14. {
  15. echo 'Błąd';
  16. }
  17.  
  18. ?>
Webmasterr
Cytat(Początkujący @ 27.08.2010, 16:11:13 ) *
  1. <?php
  2. $godzina==125;
  3. switch ($godzina) {
  4. case "$godzina>0 and $godzina<14";
  5. echo "Dzień dobry!";
  6. break;
  7. case "$godzina>=14 and $godzina<18";
  8. echo "Dobrego popołudnia";
  9. break;
  10. case "$godzina>=18 and $godzina<=24";
  11. echo "dobry wieczór";
  12. break;
  13. default:
  14. echo "Ta godzina to zła godzina";
  15. }
  16.  
  17. ?>


Na początek 1 linijka. == To operator porównania, tym = przypisuje się wartość.
Więc zamiast '==' ma być '='.

Zamiast 'and' lepiej używać operatora '&&'.

I jeszcze jedno, masz:

  1. case "wyrażenie";


a po po sekcji case powinien być dwukropek (:), nie średnik (;).


Mam jeszcze uwagę co do wydajności kodu.
Zamiast cudzysłowów (") należy używać operatora konkatenacji tzn. łączenia tekstu z czymkolwiek innnym(.).
W takim wypadku zamiast:


  1. case "$godzina>0 and $godzina<14":


byłoby:

  1. case $godzina.'>0 and '.$godzina.'<14':


Po prostu w cudzysłowach parser PHP szuka zmiennych, i innych typów danych, a w apostrofach nie szuka nic.
Początkujący
Dziękuję za porady. Jednak Po case dałem dwukropki, usunąłem operator porównywania w zmiennej godzina. I niestety dalej nie działa. Chcę to zrobić na switchu, żeby zapoznać się ze schematem robienia instrukcji w nim. Jednak dalej wyświetla dzień dobry, zamiast "ta godzina to zła godzina".
  1. <?php
  2.  
  3. $godzina=125;
  4. switch ($godzina) {
  5.  
  6. case "$godzina>0&& $godzina<14":
  7.  
  8. echo 'Dzień dobry!';
  9. break;
  10.  
  11. case "$godzina>=14 && $godzina<18":
  12.  
  13. echo 'Dobrego popołudnia';
  14.  
  15. break;
  16. case "$godzina>=18 && $godzina<=24":
  17.  
  18. echo 'dobry wieczór';
  19.  
  20. break;
  21.  
  22. default:
  23.  
  24. echo 'Ta godzina to zła godzina';
  25.  
  26. }
  27. ?>

wookieb
Kumam jeden może nie umieć ale dwóch pod rzad?
DLACZEGO WASZE CASE-Y SĄ STRINGAMI wyrażeń logicznych?
Nie dość, że nie czytacie manuala to nawet jak czytacie to wymyślone bzdety wstawiacie
  1.  
  2. switch (true) {
  3.  
  4. case $godzina>0 && $godzina<14:
  5.  
  6. (.. jedziecie dalej)
Początkujący
Działa. Wookieb, możesz wyjaśnić, w jakich sytuacjach bo case powinien być apostrof/cudzysłów, a w jakich nie?
Bo z tego " The statement list for a case can also be empty, which simply passes control into the statement list for the next case. " nie bardzo rozumiem.
Z gory dzięki
wookieb
To co masz jest specyficznym przypadkiem. Poczytaj o wyrażeniach logicznych.
Wynik "case" musi być równy temu co podajesz do switch-a.
Webmasterr
Sorki za błąd. Pisałem na szybko, ale trzeba będzie to powtórzyć...
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.