Tablica asocjacyjna przechowuje każdą wartość pod wybranym przez ciebie kluczem, zapisanym jako key => value: $user = ['name' => 'Ada', 'age' => 36];. Wartość odczytasz przez $user['name'], a dodasz lub zmienisz ją, przypisując do jej klucza: $user['email'] = 'ada@example.com';.
W innych językach ta sama struktura nazywa się słownikiem, mapą albo hashem. W PHP to zwykła tablica, której kluczami są stringi zamiast 0, 1, 2.
Dodawanie, zmiana i usuwanie par
Przypisanie do klucza, który nie istnieje, dodaje go na końcu. Przypisanie do istniejącego klucza zastępuje jego wartość i zachowuje jego pozycję. unset() usuwa parę.
array_push() tu nie pomoże: potrafi tylko dopisywać wartości z kluczami liczbowymi. Aby dodać kilka par naraz, użyj array_merge($stock, $more), gdzie wygrywają nowe wartości, albo $stock + $more, gdzie istniejące klucze zachowują swoje wartości; strona o array_merge porównuje oba sposoby.
Przechodzenie po kluczach i wartościach
foreach ($array as $key => $value) przechodzi po parach w kolejności, w jakiej je dodano. Pomiń $key =>, gdy potrzebujesz tylko wartości.
Pobieranie wszystkich kluczy lub wartości
array_keys() zwraca klucze jako zwykłą listę, a array_values() zwraca wartości, obie z nowymi indeksami od 0. Podaj array_keys() drugi argument, a zwróci tylko klucze z tą wartością: tak znajdujesz wszystkie klucze dla danej wartości.
Dla jednego klucza array_search() zwraca pierwsze dopasowanie albo false, gdy go nie ma. Strona o array_search wyjaśnia, dlaczego ten wynik trzeba porównywać przez !== false.
Sprawdzanie, czy klucz istnieje
isset($arr['key']) to zwykłe i najszybsze sprawdzenie, ale zwraca false, gdy klucz istnieje i zawiera null. array_key_exists('key', $arr) zwraca w tym przypadku true. Do odczytu z wartością zastępczą operator ?? robi obie rzeczy naraz.
Sortowanie po kluczu lub po wartości
ksort() sortuje po kluczu, a asort() po wartości, i obie zostawiają każdy klucz przy jego wartości. krsort() i arsort() sortują odwrotnie. Nie używaj sort() na tablicy asocjacyjnej: wyrzuca klucze i numeruje od nowa od 0.
Wszystkie te funkcje sortują w miejscu i zwracają true, więc $sorted = ksort($arr) daje true, a nie tablicę. Własne kolejności obsługują uasort() i uksort().
Odwracanie, liczenie i konwersja do JSON
Kilka jednolinijkowców wraca raz po raz przy danych klucz i wartość: array_flip() zamienia klucze z wartościami, array_count_values() liczy, ile razy pojawia się każda wartość, a json_encode() zamienia tablicę w obiekt JSON.
Częsty błąd: odczyt klucza, którego nie ma
Odczyt brakującego klucza zwraca null, ale twoje PHP wypisuje też ostrzeżenie:
<?php
$user = ['name' => 'Ada'];
echo $user['phone'];
Warning: Undefined array key "phone" in /var/www/html/index.php on line 3
Daj odczytowi wartość domyślną przez ??, który nigdy nie ostrzega, albo najpierw sprawdź przez isset(), gdy brakujący przypadek potrzebuje własnej gałęzi.
Wewnątrz stringa w podwójnych cudzysłowach otocz odczyt nawiasami klamrowymi, "{$user['email']}". Bez nich PHP akceptuje tylko formę bez cudzysłowów "$user[email]", w której łatwo o błąd.
Najczęściej zadawane pytania
Jak utworzyć tablicę asocjacyjną w PHP?
Zapisz każdą parę jako key => value w nawiasach kwadratowych: $prices = ['apple' => 1.2, 'pear' => 0.9];. Wartość odczytasz przez $prices['apple'].
Jak posortować tablicę asocjacyjną po kluczu w PHP?
Wywołaj ksort($arr); dla kolejności od A do Z albo krsort($arr); od Z do A. Obie sortują w miejscu, zostawiają każdą wartość przy jej kluczu i zwracają true, a nie posortowaną tablicę.
Jak przejść po tablicy asocjacyjnej w PHP?
Użyj foreach z obiema zmiennymi: foreach ($prices as $fruit => $price) { echo "$fruit: $price\n"; }. Pary wychodzą w kolejności, w jakiej je dodano.
Jak pobrać wszystkie klucze tablicy asocjacyjnej?
array_keys($arr) zwraca klucze jako tablicę indeksowaną, a array_values($arr) zwraca wartości. array_keys($arr, $value) zwraca tylko klucze, których wartość równa się $value.
Czy tablica asocjacyjna w PHP zachowuje kolejność dodawania?
Tak. Tablice w PHP to uporządkowane mapy, więc foreach, print_r i json_encode widzą pary w kolejności wstawienia, dopóki nie posortujesz tablicy przez ksort(), asort() lub podobną funkcję.