Praca z flagami w PHP
Teraz nauczymy się pracować z flagami.
Flaga to specjalna zmienna, która
może przyjmować tylko dwie wartości: true
i false. Za pomocą flag można rozwiązywać
zadania sprawdzające brak czegoś:
na przykład można sprawdzić, że w tablicy
nie ma elementu o określonej wartości. Zaczynajmy.
Rozwiążmy następujące zadanie: dana jest tablica
z liczbami, należy sprawdzić, czy znajduje się w niej
element o wartości 3 czy nie. Jeśli
tak - wypiszemy '+++', jeśli nie -
wypiszemy '---'.
Na początku spróbujmy wypisać '+++'.
W tym celu przeiterujemy po wszystkich elementach naszej tablicy
i za pomocą instrukcji if będziemy pytać - czy bieżący
element jest równy wartości 3. Jeśli tak - wypiszemy
'+++':
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
}
}
?>
Ale nasze rozwiązanie nie jest zbyt dobre: bo jeśli
w tablicy będzie nie jedna wartość 3,
a kilka, to '+++' wypisze się kilka
razy. Zmodyfikujmy naszą tablicę (stwórzmy
dwa elementy o wartości 3) i przekonajmy się o tym:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // wypisze się kilka razy
}
}
?>
Poprawmy problem: zakończmy pętlę za pomocą
break, jeśli element został już znaleziony:
<?php
$arr = [1, 2, 3, 4, 3, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++';
break; // kończymy pętlę
}
}
?>
Spróbujmy teraz zrobić tak, aby,
jeśli w tablicy w ogóle nie ma elementów o wartości
3, wypisywało się '---'. Powszechnym
błędem będzie dodanie else do
naszej instrukcji if - w tym przypadku '---' będzie
wypisywane dla wszystkich elementów, które nie są równe
3:
<?php
$arr = [1, 2, 3, 4, 5];
foreach ($arr as $elem) {
if ($elem === 3) {
echo '+++'; // wypisze się na elemencie 3
} else {
echo '---'; // wypisze się na elementach 1, 2, 4, 5
}
}
?>
A zatem, pomysł z dodaniem else - jest złym
pomysłem, nie działającym. Do rozwiązywania zadań tego
typu (takie zadania spotyka się dość
często) używa się tak zwanych flag.
Jak już wspomniano wyżej, flaga - to taka
zmienna, która może przyjmować dwie wartości:
true lub false.
A zatem, stwórzmy zmienną flag
o takim znaczeniu: jeśli jest równa true,
to w tablicy znajduje się element 3, a jeśli
false, to takiego elementu nie ma.
Początkowo ustawmy zmienną flag
na wartość false - to znaczy będziemy uważać,
że elementu 3 nie ma w tablicy:
$arr = [1, 2, 3, 4, 5];
$flag = false; // uważamy, że elementu 3 nie ma w tablicy
Następnie uruchomimy pętlę z instrukcją if tak, jak robiliśmy
to wcześniej. Jeśli pętla wykryje, że w tablicy
znajduje się element 3 - to ustawimy zmienną flag
na wartość true i wyjdziemy z pętli
za pomocą break:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false; // uważamy, że elementu 3 nie ma w tablicy
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true; // element jest - przedefiniujemy zmienną $flag
break; // wyjdziemy z pętli
}
}
?>
Odpowiedź na pytanie, czy w tablicy znajduje się 3
czy nie, możemy dać dopiero po pętli.
I tę odpowiedź już mamy: po pętli
zmienna flag mogła pozostać false
lub mogła zmienić swoją wartość na true,
jeśli pętla wykryła w tablicy 3:
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
// tutaj zmienna $flag jest równa albo true, albo false
?>
Teraz po pętli możemy zrobić instrukcję if, która
spojrzy na zmienną flag i wypisze
na ekran '+++' lub '---':
<?php
$arr = [1, 2, 3, 4, 5];
$flag = false;
foreach ($arr as $elem) {
if ($elem === 3) {
$flag = true;
break;
}
}
if ($flag === true) {
echo '+++';
} else {
echo '---';
}
?>
Dana jest tablica:
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
?>
Sprawdź, czy w tej tablicy znajduje się element
'c'. Jeśli tak - wypisz '+++',
a jeśli nie - wypisz '---'.
Napisz kod, który będzie sprawdzał liczbę pod kątem tego, czy jest pierwsza, czy nie. Liczba pierwsza dzieli się tylko przez jeden i przez samą siebie, i nie dzieli się przez inne liczby.