Lekcja ta będzie łatwa, prosta i przyjemna, poznamy coś takiego, jak operator warunkowy. Wykonamy też kilka ćwiczeń oraz nauczymy się generować losowe liczby w PHP.
Do dzieła.
Operator warunkowy – przykład
Rzućmy sobie okiem na taką sytuację. Tworzymy zmienną, do której przypisujemy tablicę. Chcemy sprawdzić i wypisać, czy zmienna jest typem liczbowym, napisem, czy tablicą właśnie:
<?php
$var1 = [1,2,3,4];
echo is_int($var1) . "</br>";
echo is_string($var1) . "</br>";
echo is_array($var1) . "</br>";
//
//
// 1
Spodziewalibyśmy się jakiegoś „false, false, true”. Tymczasem dostajemy dwa puste napisy i jedną liczbę 1, oznaczającą prawdę.
Takie wyświetlanie przez PHP wyników porównania nie jest najprzyjemniejsze.
Teraz przykład naszego operatora warunkowego:
<?php
$var1 = [1,2,3,4];
$var1_is_int = is_int($var1) ? "int" : "not an int";
$var1_is_string = is_string($var1) ? "string" : "not string";
$var1_is_arr = is_array($var1) ? "array" : "not an array";
echo "$var1_is_int</br>";
echo "$var1_is_string</br>";
echo "$var1_is_arr</br>";
// not an int
// not string
// array
Operator warunkowy stawia warunek, następnie znak zapytania. Potem co należy przypisać, jeżeli warunek jest prawdziwy, znak „:” a po nim co należy przypisać, jeżeli warunek jest nieprawdziwy.
Widzimy na przykładzie jak to działa. Inny przykład:
<?php
$people = ["Jim", "John", "Jane"];
foreach($people as $person){
$msg = $person === "John" ? "I know John" : "I dont know $person";
echo "$msg</br>";
}
// I dont know Jim
// I know John
// I dont know Jane
Tablica z imionami, przechodzimy po każdym elemencie w pętli foreach, element zapisując jako $person.
Tworzymy zmienną msg i w zależności czy $person jest równe „John” czy nie przypisujemy albo „I know John” albo „I dont know [imię danej osoby]”.
$msg wypisujemy przez echo, efekt jak widzimy.
Operatory warunkowe nie są szczególnie trudne, ale możemy je sobie przećwiczyć.
Zadanie 1 – tablica czy nie, jeśli tak to jaka
Zróbmy sobie funkcję, która sprawdza czy dana zmienna jest tablicą. Jeżeli nie – zwraca informację „not an array”. Jeżeli tak, to zwraca informację „array(list)” dla tradycyjnej tablicy-listy albo „array(assoc)” dla tablicy asocjacyjnej.
Dodam, że potrzebujemy funkcji array_is_list, dostępnej od PHP 8.1. Jeżeli mamy starszego PHP, możemy skorzystać z kompilatora online i tam sobie to przećwiczyć.
Nasza funkcja:
<?php
function check_arr($var){
$output = "not an array";
if(is_array($var))
$output = array_is_list($var) ? "array(list)" : "array(assoc)";
return $output;
}
echo check_arr(["Jim", "John", "Jane"]) . "</br>";
echo check_arr(["name" => "John", "age" => 30]) . "</br>";
echo check_arr(123) . "</br>";
// array(list)
// array(assoc)
// not an array
Tworzymy funkcję, która przyjmuje jakąś zmienną albo wartość. Tworzymy $output, który zwrócimy i na początek przypisujemy do niego wartość „not an array”.
Jeżeli jednak nasza wartość jest tablicą (dowolną) czyli spełnia warunek is_array, do naszego output przypisać chcemy jakiego rodzaju jest tablicą.
Jeżeli spełnia warunek array_is_list – jest tablicą-listą, „array(list)” przypisujemy. Jeżeli nie spełnia tego warunku, znaczy że jest tablicą, ale asocjacyjną, w końcu warunek wstępny is_array spełniła, zatem przypisujemy do output „array(assoc)”.
Zwracamy output. Testujemy funkcję na wartościach (możemy też przetestować na zmiennych).
Funkcja działa jak należy.
Zadanie 2 – lubię tylko jabłka
Mamy sobie taką tablicę:
$arr1 = ["orange", "banana", "apple", "raspberry"];
Mamy przejść po jej elementach. Jeżeli mamy do czynienia z „apple” mamy napisać „I love apples”, jeżeli nie – „I dont like [owoc]”. Proste:
<?php
$arr1 = ["orange", "banana", "apple", "raspberry"];
foreach($arr1 as $fruit){
$msg = $fruit === "apple" ? "I love apples!" : "I dont like $fruit";
echo "$msg</br>";
}
// I dont like orange
// I dont like banana
// I love apples!
// I dont like raspberry
Wydaje się proste.
Zadanie 3 – rzut kostką
Proste zadanie – piszemy funkcję, która losuje rzut od 1 do 6. Jeżeli wylosujemy 6 otrzymujemy napis „You rolled 6. You win”. Jeżeli nie – „You rolled [liczba]. Try again!”.
<?php
function roll_dice(){
$num = random_int(1,6);
return $num === 6 ? "You rolled 6. You win!" : "You rolled $num. Try again!";
}
echo roll_dice();
//You rolled 3. Try again!
Oto nasza funkcja. W moim przypadku wylosowałem 3. Funkcja zwracając wartość (tak też można) sprawdza, czy mamy 6 czy nie i w zależności od tego zwraca tę czy inną odpowiedź.
Żeby przetestować naszą funkcję w pełni użyjmy jej w pętli do-while, która wykona się co najmniej raz. Być może uda nam się wylosować 6 już za pierwszym razem? Zobaczmy:
<?php
function roll_dice(){
$num = random_int(1,6);
return $num === 6 ? "You rolled 6. You win!" : "You rolled $num. Try again!";
}
do {
$roll = roll_dice();
echo "$roll</br>";
} while ($roll !== "You rolled 6. You win!" );
// You rolled 4. Try again!
// You rolled 2. Try again!
// You rolled 3. Try again!
// You rolled 6. You win!
Funkcja bez zmian. Pętla do while, gdzie tworzymy zmienną roll, do której przypisujemy wywołanie naszej funkcji, następnie tę zmienną wypisujemy. do-while, zatem to wykona się co najmniej raz.
Warunek taki, że dopóki $roll nie jest równe „You rolled 6. You win!” pętla ma być kontynuowana.
Jak widać w moim przypadku potrzebowałem aż 4 rzutów aby wylosować 6. Nasza funkcja oraz pętla działa jak należy.
Naukę PHP będziemy kontynuować, na razie poznaliśmy dość przyjemny myślę i łatwy element tego języka, jakim jest operator warunkowy.
Operator warunkowy składa się z warunku, znaku zapytania, odpowiedzi, co jeśli warunek jest prawdziwy oraz oddzielonej dwukropkiem odpowiedzi co, jeżeli warunek jest nieprawdziwy.
Nawet można się w tej notacji doszukać pewnej logiki i sensu.
Do następnego razu!