Funkcje tablicowe
🎯 Po tej lekcji użyjesz najważniejszych funkcji tablicowych PHP do filtrowania, przekształcania i sortowania danych.
PHP dostarcza gotowe narzędzia do niemal każdej operacji na tablicach. Zamiast pisać ręcznie pętle i warunki, możesz skorzystać z wbudowanych funkcji, które robią to szybciej i czytelniej. W tej lekcji poznasz pięć z nich, których będziesz używać najczęściej.
count — ile elementów?
count zwraca liczbę elementów tablicy. Poznałeś ją już w poprzednich lekcjach:
<?php
declare(strict_types=1);
$zadania = ['zrób zakupy', 'zadzwoń do Kuby', 'napisz raport'];
echo count($zadania); // wynik: 3
$pustaTablica = [];
echo count($pustaTablica); // wynik: 0
in_array — czy wartość jest w tablicy?
in_array sprawdza, czy podana wartość znajduje się w tablicy. Zwraca true lub false:
<?php
declare(strict_types=1);
$dostepneRozmiary = ['S', 'M', 'L', 'XL'];
var_dump(in_array('M', $dostepneRozmiary)); // wynik: bool(true)
var_dump(in_array('XXL', $dostepneRozmiary)); // wynik: bool(false)
if (in_array('L', $dostepneRozmiary)) {
echo 'Rozmiar L jest dostępny';
}
// wynik: Rozmiar L jest dostępny
in_array używa luźnego porównania (==). Zawsze podawaj true jako trzeci argument, żeby wymusić ścisłe porównanie typów (===): in_array('1', [1, 2], true) zwróci false, bo string '1' to nie to samo co int 1.array_map — przekształć każdy element
array_map wywołuje funkcję dla każdego elementu tablicy i zwraca nową tablicę z wynikami. Oryginalna tablica pozostaje niezmieniona:
<?php
declare(strict_types=1);
$ceny = [10.00, 24.99, 5.49];
// Dodaj VAT 23% i zaokrąglij:
$zVat = array_map(fn($c) => round($c * 1.23, 2), $ceny);
print_r($zVat);
// wynik:
// Array
// (
// [0] => 12.3
// [1] => 30.74
// [2] => 6.75
// )
// Oryginalna tablica się nie zmieniła:
print_r($ceny);
// wynik:
// Array
// (
// [0] => 10
// [1] => 24.99
// [2] => 5.49
// )
Możesz też użyć wbudowanej funkcji zamiast closure:
<?php
declare(strict_types=1);
$imiona = ['ola', 'kuba', 'anna'];
$wielkie = array_map('strtoupper', $imiona);
print_r($wielkie);
// wynik:
// Array
// (
// [0] => OLA
// [1] => KUBA
// [2] => ANNA
// )
array_filter — wybierz pasujące elementy
array_filter przechodzi przez tablicę i zachowuje tylko te elementy, dla których callback zwraca true. Zwraca nową tablicę i zachowuje oryginalne klucze:
<?php
declare(strict_types=1);
$oceny = [2, 5, 3, 4, 1, 5, 4];
// Zostaw tylko oceny 5:
$piątki = array_filter($oceny, fn($o) => $o === 5);
print_r($piątki);
// wynik:
// Array
// (
// [1] => 5
// [5] => 5
// )
Zwróć uwagę: klucze 1 i 5 zostały zachowane z oryginalnej tablicy. Jeśli chcesz ciągłą numerację od zera, użyj array_values() na wyniku.
Bez callbacku array_filter usuwa wartości fałszywe (false, null, 0, '', []):
<?php
declare(strict_types=1);
$dane = ['Ola', '', null, 'Kuba', 0, 'Anna'];
$niepuste = array_filter($dane);
print_r($niepuste);
// wynik:
// Array
// (
// [0] => Ola
// [3] => Kuba
// [5] => Anna
// )
sort — posortuj tablicę
sort sortuje tablicę rosnąco i modyfikuje ją bezpośrednio (przez referencję). Nie zwraca posortowanej kopii — zmienia oryginalną tablicę i zwraca true gdy się powiedzie. Po posortowaniu klucze numeryczne są reindeksowane od zera:
<?php
declare(strict_types=1);
$liczby = [42, 7, 19, 3, 88];
sort($liczby);
print_r($liczby);
// wynik:
// Array
// (
// [0] => 3
// [1] => 7
// [2] => 19
// [3] => 42
// [4] => 88
// )
Działa też na stringach (porządek alfabetyczny):
<?php
declare(strict_types=1);
$imiona = ['Ola', 'Anna', 'Kuba', 'Bartek'];
sort($imiona);
print_r($imiona);
// wynik:
// Array
// (
// [0] => Anna
// [1] => Bartek
// [2] => Kuba
// [3] => Ola
// )
rsort() sortuje malejąco. asort() sortuje wartości, ale zachowuje oryginalne klucze — przydatne przy tablicach asocjacyjnych. ksort() sortuje według kluczy.Praktyczny przykład — ranking ocen
Połączmy kilka funkcji razem:
<?php
declare(strict_types=1);
$oceny = [4, 2, 5, 1, 3, 5, 4];
echo 'Liczba ocen: ' . count($oceny);
// wynik: Liczba ocen: 7
var_dump(in_array(5, $oceny));
// wynik: bool(true)
// Oceny przeliczone na procenty (5 = 100%):
$procenty = array_map(fn($o) => round($o / 5 * 100), $oceny);
print_r($procenty);
// wynik: Array ( [0] => 80 [1] => 40 [2] => 100 [3] => 20 [4] => 60 [5] => 100 [6] => 80 )
// Zostaw tylko oceny pozytywne (>= 3):
$pozytywne = array_filter($oceny, fn($o) => $o >= 3);
print_r($pozytywne);
// wynik: Array ( [0] => 4 [2] => 5 [4] => 3 [5] => 5 [6] => 4 )
// Posortuj oceny:
sort($oceny);
print_r($oceny);
// wynik: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 4 [5] => 5 [6] => 5 )
W ostatniej lekcji tego modułu zobaczysz, jak łączyć te funkcje z pętlami, by budować koszyki zakupów, podsumowania i filtry danych.
Funkcje w tej lekcji
Sprawdź się
Co robi sort($tablica) z kluczami tablicy?
sort() sortuje wartości i REINDEKSUJE klucze numeryczne od zera. Jeśli tablica miała klucze 0, 5, 10 — po sort() będą 0, 1, 2. Aby zachować klucze asocjacyjne (stringowe), użyj asort().
Czy array_filter() zachowuje oryginalne klucze tablicy?
array_filter() ZAWSZE zachowuje oryginalne klucze — zarówno z callbackiem, jak i bez. Jeśli po filtrowaniu chcesz ciągłą numerację 0, 1, 2..., użyj array_values() na wyniku.
Jaka jest różnica między array_map a array_filter?
array_map() wywołuje funkcję na każdym elemencie i zwraca nową tablicę z przekształconymi wartościami. array_filter() sprawdza każdy element i zachowuje tylko te, dla których callback zwraca true.
Ćwiczenie
Masz tablicę cen produktów: [12.50, 3.99, 45.00, 8.75, 99.90, 5.00]. Wykonaj kolejno: (1) policz ile produktów jest w tablicy, (2) sprawdź czy cena 8.75 jest na liście, (3) utwórz nową tablicę z cenami podwyższonymi o 23% VAT (zaokrąglij do 2 miejsc), (4) przefiltruj oryginalne ceny zostawiając tylko te powyżej 10 zł, (5) posortuj oryginalne ceny rosnąco.
Pokaż rozwiązanie
<?php
declare(strict_types=1);
$ceny = [12.50, 3.99, 45.00, 8.75, 99.90, 5.00];
// 1. Liczba produktów:
echo count($ceny); // wynik: 6
// 2. Czy 8.75 jest na liście:
var_dump(in_array(8.75, $ceny)); // wynik: bool(true)
// 3. Ceny z VAT:
$zVat = array_map(fn($c) => round($c * 1.23, 2), $ceny);
print_r($zVat);
// wynik:
// Array
// (
// [0] => 15.38
// [1] => 4.91
// [2] => 55.35
// [3] => 10.76
// [4] => 122.88
// [5] => 6.15
// )
// 4. Ceny powyżej 10 zł:
$drogie = array_filter($ceny, fn($c) => $c > 10);
print_r($drogie);
// wynik:
// Array
// (
// [0] => 12.5
// [2] => 45
// [4] => 99.9
// )
// 5. Sortowanie:
sort($ceny);
print_r($ceny);
// wynik:
// Array
// (
// [0] => 3.99
// [1] => 5
// [2] => 8.75
// [3] => 12.5
// [4] => 45
// [5] => 99.9
// )