Instrukcja switch
Switch - po angielsku przełącznik. Co przełączamy stosując tę instrukcję? Obejrzyjmy schemat ilustrujący działanie tej instrukcji:
1)switch ($zmienna)
2){
3) case wartość_1 : instrukcja_1; break;
4) case wartość_2 : instrukcja_1; break;
5) case wartość_3 : instrukcja_1; break;
6) ...
7) default: instrukcja_n;
8)}
9)instrukcja_programu;
"Przełączamy" różne wartości $zmiennej
. Zapis case wartość_1 : instrukcja_1; break;
należy rozumieć jako w przypadku gdy ($zmienna) posiada wartość_1, wykonaj instrukcję_1 i przerwij działanie instrukcji switch
. Nasz pseudokod, będzie wykonany następująco:
-
Jeżeli
$zmienna==wartość_1
, to wykonana zostajeinstrukcja_1
, a następnieinstrukcja_programu
, znajdująca się po nawiasie}
zamykającym w wierszu 8 blok instrukcjiswitch
. Gdyby nie było w wierszu 3break
(przerwij), to wykonanie przeszłoby do następnego wiersza, w tym przykładzie do wiersza 4. -
Jeżeli
$zmienna==wartość_2
, to wykonana zostajeinstrukcja_2
, a następnieinstrukcja_programu
. Gdyby nie było w wierszu 4break
, to wykonanie przeszłoby do następnego wiersza. -
Jeżeli
$zmienna==wartość_3
, to wykonana zostajeinstrukcja_3
, a następnieinstrukcja_programu
. Gdyby nie było w wierszu 5break
, to wykonanie przeszłoby do następnego wiersza. -
Jeżeli
$zmienna
posiada inną wartość niż wszystkie wcześniej wymienione, to zostaje wykonanainstrukcja_n
, a następnieinstrukcja_programu
. Gdybyśmy pominęli wiersz 7 zawierającydefault
, to żadna z instrukcjibloku switch
nie byłaby wykonana.
Często porównuje się instrukcję switch
, z instrukcją if...else
, trudno powiedzieć wprost która konstrukcja jest w danej sytuacji lepsza - o właściwym wyborze decyduje logika i przejrzystość kodu. Porównanie obu instrukcji pokazuje tabela:
if...else | switch |
---|---|
Sprawdzane są warunki które mogą mieć wartość true lub false. | Sprawdzane są konkretne wartości zmiennej |
Prawdziwy warunek kończy blok if...else wykonaniem instrukcji, znajdującej się przy tym warunku.
|
Właściwa wartość kończy blok switch wykonaniem instrukcji, znajdującej się przy tej wartości, ale tylko wtedy, gdy umieścimy break po tej instrukcji.
|
Z powyższego wynika, że nie ma możliwości zaprogramowania kilku instrukcji wykonywanych dla kilku prawdziwych warunków. Można to osiągnąć poprzez zagnieżdżenie if...else .
|
Z powyższego wynika, że jest możliwość prostego zaprogramowania kilku instrukcji wykonywanych dla kilku wartości zmiennej. |
Możemy zaprogramować instrukcję wykonywaną wtedy, gdy żaden z warunków nie jest spełniony - po ostatnim else nie podajemy warunku, tylko tę instrukcję.
|
Możemy zaprogramować instrukcję wykonywaną wtedy, gdy żadna z wartości nie jest równa aktualnej wartości zmiennej - instrukcję taką piszemy po default .
|
Ćwiczenie 1_11_3_1
Napisz skrypt, wyświetlający nazwę miesiąca, w zależności od podanego numeru. Zadanie to realizuje następujący kod PHP:
<?php
$nr=$_POST['pole_1'];
switch ($nr)
{
case 1:echo 'styczeń';break;
case 2:echo 'luty';break;
case 3:echo 'marzec';break;
case 4:echo 'kwiecień';break;
case 5:echo 'maj';break;
case 6:echo 'czerwiec';break;
case 7:echo 'lipiec';break;
case 8:echo 'sierpień';break;
case 9:echo 'wrzesień';break;
case 10:echo 'październik';break;
case 11:echo 'listopad';break;
case 12:echo 'grudzień';break;
default:echo 'Błędny numer miesiąca!';
}
?>
Mamy klasyczną składnię instrukcji switch
. Będzie wykonane echo...
, tylko w wierszu w którym zmienna $nr
posiada wartość znajdującą się po prawej stronie case
. Jeżeli $nr
będzie inny - na przykład 13
, to zostanie wykonane echo...
znajdujące się po default
.
Ćwiczenie 1_11_3_2
Napisz skrypt, który w zależności od otrzymanej oceny (1, 2, 3, 4, 5 lub 6) wyświetli jeden z napisów:
- Brak promocji do następnej klasy
- Promocja do następnej klasy
- Promocja z oceną celującą
Oto skrypt PHP realizujący to zadanie:
<?php
$ocena=$_POST['pole_1'];
switch ($ocena)
{
case 1:echo 'Brak promocji do następnej klasy';break;
case 2:
case 3:
case 4:
case 5:echo 'Promocja do następnej klasy';break;
case 6:echo 'Promocja z oceną celującą';break;
default:echo 'Błędnie podana ocena!';
}
?>
- Jeżeli
$ocena==1
, to wyświetlany jest napis'Brak promocji do następnej klasy'
i kończony jestswitch
, ponieważ mamy tambreak
. - Jeżeli
$ocena!=1
, to wykonanie przechodzi do następnego wiersza. - Jeżeli
$ocena==2
, to nic nie jest wykonywane, natomiast brakbreak
, powoduje przejście wykonania do nowego wiersza. - Jeżeli
$ocena!=2
, to wykonanie przechodzi do następnego wiersza. - W przypadku ocen 3 i 4 mamy sytuację analogiczną do opisanej w dwóch poprzednich punktach.
- Jeżeli
$ocena==5
, lub$ocena==6
, to mamy klasyczną składnię z instrukcją do wykonania orazbreak
, który powoduje wyjście z blokuswitch
.
Ćwiczenie 1_11_3_3
Napisz skrypt, który wypisze listę przedmiotów które będziesz miał danego dnia począwszy od danej godziny lekcyjnej. Dla uproszczenia wpisujemy nie więcej jak 5 przedmiotów.
Kod PHP wykonujący to zadanie:
<?php
$gl=$_POST['godzina_lekcyjna'];//na przykład 2
$p1=$_POST['przedmiot1'];//na przykład matematyka
$p2=$_POST['przedmiot2'];//na przykład j.polski
$p3=$_POST['przedmiot3'];//na przykład geografia
$p4=$_POST['przedmiot4'];//na przykład informatyka
$p5=$_POST['przedmiot5'];//na przykład historia
$przedmioty='';
switch ($gl)
{
case 1:$przedmioty.=$p1.'<br />';//to nie jest przykładowa godzina (2), więc $przedmioty==''
case 2:$przedmioty.=$p2.'<br />';//to jest przykładowa godzina, więc $przedmioty==j.polski
case 3:$przedmioty.=$p3.'<br />';//nie było break, więc dołączamy kolejny przedmiot
case 4:$przedmioty.=$p4.'<br />';//nie było break, więc dołączamy kolejny przedmiot
case 5:$przedmioty.=$p5;break;//break kończy blok switcha
default:$przedmioty='Błędnie podana godzina lekcyjna!';//jeżeli użytkownik poda np. liczbę 6
}
echo $przedmioty;
?>
Brak break
od 1
do 4
godziny lekcyjnej powoduje, że np. w przypadku 2
godziny, będzie wykonana instrukcja znajdująca się w tym wierszu, ale także wszystkie następne instrukcje aż do break
.
Ćwiczenie 1_11_3_4
Dzienny plan zajęć pewnej konferencji wygląda następująco:
- godzina 8 śniadanie
- godz. 9-10 wykład
- godz. 11-13 zajęcia w grupach
- godz. 14 obiad
- godz. 15-17 film
- godz. 18-19 kolacja
Kod PHP wykonujący to zadanie:
<?php
function tekst($nr_zajec)
{
$wynik='';
$wynik.='śniadanie'; if ($nr_zajec==1) return $wynik;
$wynik.=', wykład'; if ($nr_zajec==2) return $wynik;
$wynik.=', zajęcia w grupach'; if ($nr_zajec==3) return $wynik;
$wynik.=', obiad'; if ($nr_zajec==4) return $wynik;
$wynik.=', film'; if ($nr_zajec==5) return $wynik;
$wynik.=', kolacja'; if ($nr_zajec==6) return $wynik;
return $wynik;
}
$g=$_POST['godzina'];
switch ($g)
{
case 8: echo tekst(1);break;
case 9: case 10: echo tekst(2);break;
case 11: case 12: case 13: echo tekst(3);break;
case 14: echo tekst(4);break;
case 15: case 16: case 17: echo tekst(5);break;
case 18: case 19: echo tekst(6);break;
default: echo 'Błędnie podana godzina';
}
?>
Ćwiczenie 1_11_3_5
Napisz skrypt, który pokaże wszystkie zajęcia z poprzedniego ćwiczenia, które tym razem odbywają się po wskazanej godzinie włącznie.
Kod PHP wykonujący to zadanie:
<?php
$g=$_POST['godzina'];
switch ($g)
{
case 8: echo 'śniadanie, ';
case 9: case 10: echo 'wykład, ';
case 11: case 12: case 13: echo 'zajęcia w grupach, ';
case 14: echo 'obiad, ';
case 15: case 16: case 17: 'film, ';
case 18: case 19: echo 'kolacja';break;
default: echo 'Błędnie podana godzina';
}
?>
Jeżeli zapomniałeś jak przygotować i gdzie zapisywać pliki testowe: