Instrukcje warunkowe
if, else, elseif
Instrukcje warunkowe (if, else, elseif), instrukcje wyboru (switch, match) oraz operatory warunkowe pozwalają programowi podejmować decyzje i wykonywać różne fragmenty kodu w zależności od spełnienia określonych warunków. Najprościej mówiąc – odpowiadają na pytania „co jeżeli?”.
Podam wam teraz prosty przykład:
Jeżeli liczba jest większa od zera, to wypisz że jest dodatnia
zapis tego stwierdzenia za pomocą instrukcji if będzie wyglądał następująco:
if($liczba>0) echo "jest dodatnia";
Jeżeli potrzebujemy rozwinąć naszą myśl o zapytanie „a co gdy warunek nie jest spełniony?” – używamy else.
Jeżeli liczba jest większa od zera, to wypisz że jest dodatnia – w przeciwnym wypadku napisz, że nie jest dodatnia
if($liczba>0) {
echo "jest dodatnia";
}
else {
echo "nie jest dodatnia";
}
Oczywiście instrukcje możemy zagnieżdżać jedna w drugiej.
Może zajść sytuacja, że przed użyciem else chcemy sprawdzić jeszcze jakieś inne warunki, wtedy przychodzi nam z pomocą instrukcja elseif.
if($liczba>0)
{
echo "jest dodatnia";
}
elseif($liczba==0)
{
echo "liczba jest zerem";
}
else
{
echo "jest ujemna";
}
Ważne: Instrukcje można zagnieżdżać jedna w drugiej.
UWAGA! w instrukcji warunkowej nie używamy operatora „=” (operator przypisania). Używamy „==” (dwa znaki =) lub „===” (trzy znaki =)
switch
Gdy wiemy, że nasza zmienna będzie przyjmowała jakieś konkretne wartości, możemy użyć wtedy instrukcji switch.
switch ($plec) {
case "K":
echo "Kobieta";
break;
case "M":
echo "Mężczyzna";
break;
default:
echo "Nierozpoznany wybór";
break;
}
break; używamy by przerwać działanie instrukcji, gdy warunek zostanie spełniony.
default; oznacza akcję domyślą, gdy żaden z warunków nie zostanie spełniony.
UWAGA! Switch używa luźnego porównania (==), co może prowadzić do niespodziewanych rezultatów przy porównywaniu typów.
Wyrażenie match (PHP 8.0+)
Match to nowoczesna alternatywa dla switch, wprowadzona w PHP 8.0. Jest bezpieczniejsza i bardziej zwięzła:
$plec = "K";
$wynik = match($plec) {
"K" => "Kobieta",
"M" => "Mężczyzna",
default => "Nierozpoznany wybór"
};
echo $wynik;
Różnice między switch a match:
| Cecha | switch | match |
|---|---|---|
| Porównanie | Luźne (==) | Ścisłe (===) |
| Zwraca wartość | Nie | Tak |
| Wymaga break | Tak | Nie |
| Fall-through | Tak | Nie |
Przykład z wieloma warunkami:
$statusCode = 404;
$komunikat = match($statusCode) {
200, 201, 204 => "Sukces",
400, 404 => "Błąd klienta",
500, 502, 503 => "Błąd serwera",
default => "Nieznany status"
};
echo $komunikat;
Match z wyrażeniami:
$wiek = 25;
$kategoria = match(true) {
$wiek < 13 => "dziecko",
$wiek < 18 => "nastolatek",
$wiek < 65 => "dorosły",
default => "senior"
};
echo $kategoria;
Alternatywna składnia if i switch
Można zastąpić nawias { znakiem : i zamiast zamykającego } użyć odpowiednio endif; lub endswitch;
Przykład dla if:
if ($a == 5):
echo "a jest równe 5";
echo "...";
elseif ($a == 6):
echo "a jest równe 6";
echo "!!!";
else:
echo "a nie jest 5 ani 6";
endif;
Przykład dla switch:
switch ($plec):
case "K":
echo "Kobieta";
break;
case "M":
echo "Mężczyzna";
break;
default:
echo "Nierozpoznany wybór";
break;
endswitch;
Ta forma zapisu jest bardzo rzadko spotykana i używana głównie w szablonach mieszających PHP z HTML.
Operator warunkowy (ternary)
Operator warunkowy to skrócona forma instrukcji if…else, która zwraca wartość:
$wiek = 20;
$status = ($wiek >= 18) ? "pełnoletni" : "niepełnoletni";
echo $status; // wypisze: pełnoletni
Składnia: (warunek) ? wartość_jeśli_prawda : wartość_jeśli_fałsz
Zagnieżdżone operatory:
$ocena = 85;
$wynik = ($ocena >= 90) ? "celujący"
: ($ocena >= 75) ? "bardzo dobry"
: ($ocena >= 60) ? "dobry"
: "dostateczny";
Null Coalescing Operator (PHP 7.0+)
Operator ?? sprawdza, czy zmienna istnieje i nie jest null:
// Stary sposób:
$nazwa = isset($_GET['nazwa']) ? $_GET['nazwa'] : 'Gość';
// Nowy sposób (PHP 7.0+):
$nazwa = $_GET['nazwa'] ?? 'Gość';
// Łańcuchowe sprawdzanie (PHP 7.0+):
$config = $userConfig ?? $defaultConfig ?? 'brak';
Spaceship Operator (PHP 7.0+)
Operator <=> służy do porównywania wartości:
$a = 10;
$b = 5;
echo $a <=> $b; // zwraca 1 (gdy a > b)
echo $b <=> $a; // zwraca -1 (gdy b < a)
echo $a <=> $a; // zwraca 0 (gdy a == b)
// Przydatny przy sortowaniu:
usort($array, fn($a, $b) => $a <=> $b);
Zadania do wykonania:
Zadanie 1: Napisz program sprawdzający czy liczba jest parzysta.
Rozwiązanie:
$a = 5;
if ($a == 0) {
echo 'podałeś 0';
} elseif ($a % 2 == 0) {
echo 'parzysta';
} else {
echo 'nieparzysta';
}
Zadanie 2: Porównaj ze sobą 2 dowolne liczby i wypisz która jest większa.
Rozwiązanie:
echo "<u>Zadanie 2: Porównaj ze sobą 2 dowolne liczby i wypisz która jest większa.</u><br><br>";
$a = 10;
$b = 5;
echo "Porównujemy liczby $a i $b<br>";
if ($a > $b) {
echo "większa jest liczba a = $a";
} elseif ($b > $a) {
echo "większa jest liczba b = $b";
} else {
echo "liczby są równe";
}
//rozwiązanie z match
$wynik = match(true) {
$a > $b => "większa jest liczba a = $a",
$b > $a => "większa jest liczba b = $b",
default => "liczby są równe"
};
echo $wynik;
Zadanie 3: Porównaj ze sobą 4 nie równe sobie liczby i wypisz największą.
Rozwiązanie:
echo "<u>Zadanie 3: Porównaj ze sobą 4 nierówne sobie liczby i wypisz największą.</u><br><br>";
$a = 10;
$b = 5;
$c = 18;
$d = 1;
$max = $a;
echo "Porównujemy liczby: $a, $b, $c, $d<br>";
if ($b > $max) { $max = $b; }
if ($c > $max) { $max = $c; }
if ($d > $max) { $max = $d; }
echo "największa z liczb to $max";
Zadanie 4: Porównaj ze sobą 3 nie równe sobie liczby i wypisz je w kolejności od największej do najmniejszej.
Rozwiązanie:
echo "<u>Zadanie 4: Porównaj ze sobą 3 nierówne sobie liczby i wypisz je w kolejności od największej do najmniejszej.</u><br><br>";
$a = 10;
$b = 5;
$c = 18;
echo "Porównujemy liczby: $a, $b, $c<br>";
// Szukamy najmniejszej
$min = $a;
if ($b < $min) { $min = $b; }
if ($c < $min) { $min = $c; }
// Szukamy największej
$max = $a;
if ($b > $max) { $max = $b; }
if ($c > $max) { $max = $c; }
// Środkowa to ta, która nie jest ani min ani max
if ($a != $min && $a != $max) { $mid = $a; }
if ($b != $min && $b != $max) { $mid = $b; }
if ($c != $min && $c != $max) { $mid = $c; }
echo "Liczby posortowane: $max, $mid, $min";
Zadanie 5: Porównaj ze sobą 4 nie równe sobie liczby i wypisz je w kolejności od największej do najmniejszej.
Rozwiązanie:
echo "<u>Zadanie 5: Porównaj ze sobą 4 nierówne sobie liczby i wypisz je w kolejności od największej do najmniejszej.</u><br><br>";
$a = 10;
$b = 5;
$c = 18;
$d = 1;
echo "Porównujemy liczby: $a, $b, $c, $d<br>";
// Szukamy najmniejszej
if ($a < $b && $a < $c && $a < $d) {
$l1 = $a;
} elseif ($b < $a && $b < $c && $b < $d) {
$l1 = $b;
} elseif ($c < $a && $c < $b && $c < $d) {
$l1 = $c;
} else {
$l1 = $d;
}
// Szukamy największej
$l4 = $a;
if ($b > $l4) { $l4 = $b; }
if ($c > $l4) { $l4 = $c; }
if ($d > $l4) { $l4 = $d; }
// Szukamy dwóch środkowych
$m2 = null;
if ($a != $l1 && $a != $l4) {
$m1 = $a;
$m2 = empty($m2) ? $a : $m2;
}
if ($b != $l1 && $b != $l4) {
$m1 = $b;
$m2 = empty($m2) ? $b : $m2;
}
if ($c != $l1 && $c != $l4) {
$m1 = $c;
$m2 = empty($m2) ? $c : $m2;
}
if ($d != $l1 && $d != $l4) {
$m1 = $d;
}
$l2 = ($m1 > $m2) ? $m2 : $m1;
$l3 = ($m1 < $m2) ? $m2 : $m1;
echo "Liczby posortowane: $l4, $l3, $l2, $l1";
Zadanie 6: Napisz program potrafiący rozwiązywać równanie kwadratowe: y = ax2 + bx + c. Przypominamy, że ilość rozwiązań zależy od wartości tzw. współczynnika Δ (Δ = b2 − 4ac).
Rozwiązanie:
echo "<u>Zadanie 6: Napisz skrypt, obliczający pierwiastki trójmianu kwadratowego ax<sup>2</sup> + bx + c = 0. Za obliczanie pierwiastka kwadratowego odpowiada funkcja sqrt(\$zmienna)</u></br></br>";
$a = 1;
$b = 2;
$c = 1;
$delta = $b * $b - 4 * $a * $c; //obliczamy wg wzoru
if ($delta > 0)
{
$x1 = (-$b - sqrt($delta)) / (2 * $a; //sqrt() pierwiastek kwadratowy
$x2 = (-$b + sqrt($delta)) / (2 * $a;
echo ' posiada dwa pierwiastki x1 = '.$x1.', x2 = '.$x2;
}
else if ($delta == 0)
{
$x = -$b / 2 * $a;
echo ' posiada jeden pierwiastek x = '.$x;
}
else echo ' nie posiada pierwiastków';
Zadanie 7: Zrealizuj kalkulator, który dla zadanych liczb w zależności od wartości zmiennej $wybor wykonuje: mnożenie, dzielenie, odejmowanie, dodawanie. Użyj instrukcji „switch”.
Rozwiązanie:
echo "<u>Zadanie 7: Kalkulator</u><br><br>";
$liczba1 = 4;
$liczba2 = 2;
$wybor = '/';
switch ($wybor) {
case "+":
echo $liczba1 + $liczba2;
break;
case "-":
echo $liczba1 - $liczba2;
break;
case "*":
echo $liczba1 * $liczba2;
break;
case "/":
if ($liczba2 != 0) {
echo $liczba1 / $liczba2;
} else {
echo "Błąd: dzielenie przez zero!";
}
break;
default:
echo "Nieznana operacja";
break;
}
//rozwiązanie z match
$wynik = match($wybor) {
"+" => $liczba1 + $liczba2,
"-" => $liczba1 - $liczba2,
"*" => $liczba1 * $liczba2,
"/" => $liczba2 != 0 ? $liczba1 / $liczba2 : "Błąd: dzielenie przez zero!",
default => "Nieznana operacja"
};
echo $wynik;
Zadanie 8: Napisz program, który dla danego punktu na płaszczyźnie sprawdzi, w której ćwiartce układu współrzędnych się on znajduje. Może jednak być tak, że punkt nie znajduje się w żadnej ćwiartce – leży na jednej z osi lub w środku układu współrzędnych. Wówczas program powinien to stwierdzić. Na wejściu znajdują się dwie liczby całkowite oddzielone spacją, x i y(−1 000 000 000≤x, y≤1 000 000 000), oznaczające współrzędne danego punktu. Jeżeli podany punkt nie leży na żadnej z osi, Twój program powinien wypisać: I, II, III lub IV, w przypadku gdy punkt należy do, odpowiednio, pierwszej, drugiej, trzeciej lub czwartej ćwiartki układu współrzędnych. Jeżeli punkt leży w środku układu współrzędnych, program powinien wypisać liczbę 0. W przeciwnym razie, program powinien wypisać OX (duże O i duże X), jeśli punkt leży na osi X, a OY – jeśli punkt leży na osi Y.
Przykład
Dla danych wejściowych:
5 7
poprawnym wynikiem jest:
I
a dla danych wejściowych:
0 -1000000000
poprawnym wynikiem jest:
OY
natomiast dla danych wejściowych:
0 0
Zadanie 9: Twoim zadaniem jest stwierdzić, czy z trzech odcinków o podanych długościach można zbudować trójkąt o dodatnim polu. Pierwszy i jedyny wiersz wejścia zawiera trzy liczby naturalne a,b,c(1≤a, b, c≤1 000 000 000), oddzielone spacjami. Liczby te oznaczają długości trzech odcinków. Twój program powinien wypisać jedno słowo TAK lub NIE, w zależności od tego, czy z odcinków o długościach takich jak na wejściu można zbudować niezdegenerowany trójkąt, czyli trójkąt o dodatnim polu.
Przykład
Dla danych wejściowych:
8 7 5
poprawnym wynikiem jest:
TAK
a dla danych wejściowych:
1 10 2
poprawnym wynikiem jest:
NIE
oraz dla danych wejściowych:
4 4 8
poprawnym wynikiem jest:
NIE
Zadanie 16: Napisz skrypt, który sprawdzi, czy zmienna $z jest liczbą trzycyfrową (użyj instrukcji warunkowej if)
Zadanie 17: Napisz skrypt, który w zależności od wartości zmiennej $age umieszcza odpowiedni napis na stronie:
• jeżeli $wiek mniejszy od 18, wyświetl: „Jeszcze nie możesz głosować”
• jeżeli $wiek większy lub równy 18, wyświetl: „Możesz tylko głosować”
• jeżeli $wiek większy lub równy 21, wyświetl: „Możesz głosować i kandydować do Sejmu”
• jeżeli $wiek większy lub równy 30, wyświetl: „Możesz głosować i kandydować do Sejmu i Senatu”
• jeżeli $wiek większy lub równy 35, wyświetl: „Możesz głosować, kandydować do Sejmu i Senatu oraz
na Prezydenta”
Zadanie zrealizuj za pomocą instrukcji warunkowej if oraz Switch
Zadanie 18: Napisz skrypt, używając instrukcji switch, który umieszcza na stronie odpowiednią liczbę znaków + (plus) w zależności od wartości zmiennej $ile:
- jeżeli $ile równe 1: wyświetl: +
- jeżeli $ile równe 2: wyświetl: ++
- jeżeli $ile równe 3: wyświetl: +++
- …
- jeżeli $ile równe 9: wyświetl: +++++++++
- jeżeli $ile mniejsze od 1 lub większe od 9: wyświetl: „Wartość poza zakresem”
Zadanie 19: Napisz skrypt, używając instrukcji switch, który umieszcza na stronie napis z numerem kwartału roku w od zmiennej $miesiac:
- jeżeli $miesiac równe 1,2, lub 3: wyświetl: „Kwartał I”
- jeżeli $miesiac równe 4,5, lub 6: wyświetl: „Kwartał II”
- jeżeli $miesiac równe 7,8, lub 9: wyświetl: „Kwartał III”
- jeżeli $miesiac równe 10,11, lub 12: wyświetl: „Kwartał IV”
- jeżeli $miesiac mniejsze od 1 lub większe od 12: wyświetl: „Błędny numer miesiąca”