$tab = array(); for ($i = 0; $i < 10; $i++) { $tab[$i] = rand(-100, 100); } foreach ($tab as $x) { if ($x < 0) { echo "$x "; } } Działaniem...
$tab = array(); for ($i = 0; $i < 10; $i++) { $tab[$i] = rand(-100, 100); } foreach ($tab as $x) { if ($x < 0) { echo "$x "; } }Działaniem przedstawionego kodu PHP będzie wypełnienie tablicy
A. kolejnymi liczbami od 0 do 9 i ich wypisanie
B. 100 losowymi wartościami, a następnie wypisanie wartości dodatnich
C. 10 losowymi wartościami, a następnie wypisanie wartości ujemnych
D. kolejnymi liczbami od -100 do 100 i wypisanie wartości ujemnych
Kod najpierw tworzy pustą tablicę $tab, a potem pętla for wykonuje się dokładnie 10 razy, bo $i startuje od 0 i działa dopóki $i < 10. W każdej iteracji pod indeksem $tab[$i] zapisywana jest wartość zwrócona przez rand(-100, 100), czyli losowa liczba całkowita z zakresu od -100 do 100, włącznie z końcami tego przedziału. To ważne: zmienna $i nie jest tu wartością wpisywaną do tablicy, tylko indeksem komórki. Dopiero foreach przechodzi po wszystkich wylosowanych elementach jako $x i sprawdza warunek $x < 0. Jeśli liczba jest ujemna, zostaje wypisana. W praktyce taki schemat często stosuje się np. do filtrowania danych: najpierw mamy zbiór wartości, a potem wybieramy tylko te, które spełniają warunek. Moim zdaniem to bardzo dobry przykład na zrozumienie różnicy między indeksem tablicy a wartością elementu. W dobrych praktykach PHP warto też pamiętać, że rand() w nowszym kodzie często zastępuje się mt_rand() albo random_int(), zwłaszcza gdy losowość ma znaczenie bezpieczeństwa. Tutaj jednak, do prostego ćwiczenia z tablic i pętli, rand(-100, 100) jest całkiem czytelne.
Najczęstsza pomyłka w tym zadaniu wynika z pomieszania roli zmiennej sterującej pętlą z wartością zapisywaną do tablicy. Zmienna $i faktycznie przyjmuje kolejno wartości od 0 do 9, ale służy tylko jako indeks, czyli wskazuje miejsce w tablicy: $tab[0], $tab[1], $tab[2] i tak dalej. Do tych miejsc nie jest wpisywane samo $i, tylko wynik funkcji rand(-100, 100). Dlatego tablica nie zawiera po prostu kolejnych liczb od 0 do 9. To dość klasyczny błąd przy analizie pętli for, szczególnie gdy indeks i wartość elementu są blisko siebie w tym samym wierszu kodu.
Nie można też uznać, że kod wpisuje kolejne liczby od -100 do 100. Funkcja rand() nie generuje sekwencji uporządkowanej, tylko losuje jedną liczbę z podanego zakresu przy każdym wywołaniu. Zakres od -100 do 100 oznacza możliwe wartości, a nie liczbę elementów ani kolejność. Tablica ma tylko 10 elementów, bo tyle razy wykona się pętla for. Gdyby program miał wypełnić tablicę wszystkimi liczbami od -100 do 100, potrzebna byłaby inna konstrukcja, np. pętla przechodząca po wartościach od -100 do 100.
Mylny jest również wniosek, że powstaje 100 losowych wartości. Liczba 100 pojawia się jako górna granica losowania, a nie jako liczba powtórzeń pętli. O liczbie elementów decyduje warunek $i < 10. Na końcu foreach nie wypisuje wartości dodatnich, tylko ujemne, ponieważ warunek brzmi $x < 0. Z mojego doświadczenia najlepiej czytać taki kod w dwóch etapach: najpierw ile razy coś się wykona, potem co dokładnie zostanie zapisane i jaki warunek filtruje wynik.
Nie można też uznać, że kod wpisuje kolejne liczby od -100 do 100. Funkcja rand() nie generuje sekwencji uporządkowanej, tylko losuje jedną liczbę z podanego zakresu przy każdym wywołaniu. Zakres od -100 do 100 oznacza możliwe wartości, a nie liczbę elementów ani kolejność. Tablica ma tylko 10 elementów, bo tyle razy wykona się pętla for. Gdyby program miał wypełnić tablicę wszystkimi liczbami od -100 do 100, potrzebna byłaby inna konstrukcja, np. pętla przechodząca po wartościach od -100 do 100.
Mylny jest również wniosek, że powstaje 100 losowych wartości. Liczba 100 pojawia się jako górna granica losowania, a nie jako liczba powtórzeń pętli. O liczbie elementów decyduje warunek $i < 10. Na końcu foreach nie wypisuje wartości dodatnich, tylko ujemne, ponieważ warunek brzmi $x < 0. Z mojego doświadczenia najlepiej czytać taki kod w dwóch etapach: najpierw ile razy coś się wykona, potem co dokładnie zostanie zapisane i jaki warunek filtruje wynik.