PHP instrukcje warunkowe

Wprowadzenie

Podstawowa składnia instrukcji warunkowej jest następująca:


$nr = jakaś liczba;

if ($nr > 20) { //jeżeli prawda
	echo "Liczba jest większa od 20");
} else { //w przeciwnym razie
	echo "Liczba jest mniejsza lub równa 20");
}
		

W instrukcji warunkowej PHP może pojawić się klauzula elseif.
Możemy wówczas sprawdzić wiele warunków:


$nr = jakaś liczba;
if($nr < 10) {
	echo "Liczba $nr jest mniejsza od 10";
}
elseif($nr < 20) {
	echo "Liczba $nr jest większa równa 10 ale jest mniejsza od 20";
}
elseif($nr < 30) {
	echo "Liczba $nr jest większa równa 20 ale jest mniejsza od 30";
}
else {
	echo "Liczba $nr jest większa równa 30";
}

	

Przykładowo dla wartości 22 otrzymamy komumikat: Liczba 22 jest większa równa 20 ale jest mniejsza od 30

Porównywanie łańcuchów tekstowych

Porównanie odbywa się podobnie jak sortowanie wyrazów (zdań).
Większy jest ten, który rozpoczyna się "późniejszą" literą alfabetu:

Np. b jest "większe" od a
porównując:


$a = "ala";
$b = "bartek";
if($a > $b) echo "ala jest większa od bartek";
else echo "bartek jest większy od ala";

Otrzymamy informację:
bartek jest większy od ala

W operacjach prówniania ważna jest wielkość liter.
Litera wielka jest miniejsza od małej: "a" > "A" w wyniku otrzymamy prawda

Wynika to z tego, że porównywane są kody ASCII znaków.
Literze a odpowiada kod 97, natomiast A kod 65.

Podobnie cyfry są "mniejsze" od liter, gdyż: 0 ma kod 48, 9 kod 57

Wracając do przykładu porównania imion, jeśli zapiszemy:


$a = "ala";
$b = "Bartek";
if($a > $b) echo "ala jest większa od Bartek";
else echo "Bartek jest większy od ala";
	

Otrzymamy informację:
ala jest większa od Bartek

przykłady

"ab" > "aa" -> true
"pies" > "kot" -> true
"abc" > "acc" - false
"alicja" > "bela" -> false
"Marcin" > "Ania" -> true
	

Porównywanie danych różnych typów

W przypadku porównywania wartości innych typów są one konwertowane do liczb, a następnie porównywane są te liczby:

Możemy dokonać porównania wartości liczbowej i tekstowej:


$a = "7";
$b = 5;
if($a > $b) echo "$a większe od $b";
else echo "$b większe od $a";
	

Jeśli wartość tekstową możemy przekonwertować na liczbową, wówczas porównywane są liczby.
W powyższym przykładzie otrzymamy komunikat:
7 większe od 5

Jeśli jednak tekst nie będzie liczbą:


$a = "a";
$b = 5;
if($a > $b) echo "$a większe od $b";
else echo "$b większe od $a";
	

Otrzymamy informację:
5 większe od a
gdyż a w tym przypadku ma wartość 0.

Idąc dalej, jeśli zmiennej nadamy wartość ujemną: $b=-5, wówczas otrzymamy komunikat:
a większe od -5

inne przykłady

"3" > 2 -> true bo 3 > 2
"02" > 3 -> false bo 2 > 3 
"0" == 0 -> true

true > 2 -> false bo true to 1
false < 2 -> true bo false to 0

"Ala" > 0 -> false bo konwersja "Ala" na liczbę to NaN (NonANumber), 
                    a NaN jest mniejsze od każdej liczby
	

Wartości falsy


$a = 20;
$b = 0;
$c = null;
if ($a) { //to się wykona bo a !== 0
	echo "A ma wartość ", $a;
}
if ($b) { //to się nie wykona bo b === 0
	echo "A ma wartość ", $b;
}
if ($c) { //to się nie wykona bo null
	echo "A ma wartość ", $c;
}
if (false) { //to się nie wykona bo false to false
}
	

Każda inna wartość daje w rezultacie true. Możemy to sprawdzić konwertując dane wartości na Boolean:


Boolean(false); //false
Boolean(null); //false
Boolean(undefined); //false
Boolean(0); //false
Boolean(NaN); //false
Boolean(""); //false
Boolean("Ala"); //true
Boolean(2); //true
Boolean(2-2); //false

$x;
Boolean(x); //false bo x nie ma wartości czyli undefined
	

Operator warunkowy

Operator warunkowy (tak zwany ternary operator), to tak naprawdę skrócona wersja warunku if:


$x = (wyrażenie) ? jeżeli_true : jeżeli_false
	

$i = 1;
$number = "";
if ($i > 0) {
	$number = "dodatnia";
} else {
	$number = "ujemna";
}

//to samo tylko w skróconej wersji
$number = ($i > 0)? "dodatnia" : "ujemna";
	

Przykłady zastosowania:


$x = 23;
$isEven = ($x % 2 === 0)? "parzysta" : "nieparzysta";
echo $isEven; //"nieparzysta"

$age = 21;
$status = ($age >= 18) ? "zapraszamy na seans" : "jesteś za młody";
echo $status; //"zapraszamy na seans"

$name = "Ola";
echo  ($name === "Ola") ? "Masz na imię Ola" : "Nie masz na imię Ola";  //"Masz na imię Ola"

$nr = 10;
$answer = "10";
echo $answer === $nr ? "yes" : "no";

$isMember = true;
echo  "Koszt usługi to ";
echo $isMember ? "2.00" : "10.00";
echo " zł";
	

Po wykonaniu powyższego kodu otrzymamy:


nieparzysta
zapraszamy na seans
Masz na imię Ola
no
Koszt usługi to 2.00 zł
	

Switch

Instrukcja switch jest kolejnym sposobem tworzenia warunków - tym razem na zasadzie przyrównania wyniku do konkretnych wartości.


switch (wyrazenie) {
	case wartosc1:
		break;
	case wartosc2:
		break;
	default:
		//fragment domyślny - warunki wyżej nie wykonają się;		
}
	

Każdy przypadek kończy się słowem break, które kończy wykonywanie instrukcji switch.
Jeżeli pominiemy to słowo, wtedy nawet przy pomyślnym przyrównaniu zostaną wykonane kolejne sprawdzenia, co często może powodować błędy.
Dodatkowo instrukcja switch ma specjalny przypadek default który będzie wybierany, gdy wszystkie inne przypadki będą błędne (odpowiednik else w instrukcji if).


$number = jakaś wartość

switch ($number) {
	case "pies":
		echo "Psy są najlepsze");
		break;
	case "kot":
		echo "Koty są lepsze od psów");
		break;
	case "chomik":
		echo "Każdy chomik jest super");
		break;
	case "świnka":
		echo "Świnki są fajowe");
		break;
	default:
		echo "Jakiś dziwny ten zwierzak");
}
	

Warto zaznaczyć, że instrukcja switch nie służy do testowania warunków, a do przyrównywania zmiennej do wartości:


$car = "bmw";

switch ($car) {
	case "bmw" : ... break;
	case "fiat" : ... break;
	case "audi" : ... break;
}

//poniższe przyrównywanie nie zadziała
$nr = 5;
switch ($nr) {
	case ($nr >= 5):
		echo "Mało");
	break;
	case ($nr > 5 && $nr <= 10):
		echo "Średnio");
	break;
	case ($nr > 15) :
		echo "Dużo");
	break;
}
	

Jednak i tutaj można przyrównać do warunków. Wystarczy przyrównywać zamiast do zmiennej to do wartości true:


$nr = 5;
switch (true) {
	case ($nr >= 5):
		echo "Mało");
	break;
	case ($nr > 5 && $nr <= 10):
		echo "Średnio");
	break;
	case ($nr > 10) :
		echo "Dużo");
	break;
}
	

Zastosowanie tego jest niespotykane i traktował bym to jako ciekawostkę.

Projekt i wykonanie: Ryszard Rogacz© 1999−2024