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!