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
⚠️ Ścisłe porównanie: Domyślnie 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
// )
💡 Inne warianty sort: 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?

Czy array_filter() zachowuje oryginalne klucze tablicy?

Jaka jest różnica między array_map a array_filter?

Ć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
// )