Tablice PHP - twórz, modyfikuj, przetwarzaj, używaj foreach

Tablice PHP – podstawy

Skrypty PHP bardzo często operują na danych, które można przechowywać i reprezentować na różne sposoby. Do najczęściej używanych i najważniejszych konstrukcji służących do tego celu należą tablice PHP. Choć w poprzednich rozdziałach o tablicach wspominałem już wielokrotnie, to jeszcze dokładnie się im nie przyjrzeliśmy. Teraz nadrobimy tę zaległość.

Jak być może pamiętasz z rozdziału o typach danych PHP, tablica zalicza się do grupy typów złożonych. To znaczy, że umożliwia przechowywanie więcej niż jednej wartości na raz.

Na przykład w zmiennej skalarnego typu int można zapisać jedną liczbę całkowitą, w zmiennej skalarnego typu float można zapisać jedną liczbę zmiennoprzecinkową, a w zmiennej złożonego typu tablicowego można zapisać dowolną liczbę wartości dowolnego typu.

Dzięki umieszczeniu wielu wartości w jednym kontenerze, np. wszystkich danych przesłanych przez użytkownika za pośrednictwem formularza internetowego, można nimi efektywnie operować i je wygodnie przetwarzać.

Oczywiście nie ma sensu umieszczać w tablicy elementów danych, które nie mają ze sobą nic wspólnego. Tablic używa się przede wszystkim do przechowywania pod jedną nazwą wielu pozycji, które mają ze sobą jakiś związek. Mogą to być na przykład dane z formularza, lista gości zaproszonych na imprezę, czy zawartość koszyka w sklepie internetowym.

Przechodząc do konkretów, w tym rozdziale poznasz odpowiedzi między innymi na następujące pytania, które z pewnością od dawna nie dają ci spać:

  • Co to jest tablica PHP?
  • Ile typów tablic jest w PHP?
  • Czym różni się tablica asocjacyjna od indeksowanej numerycznie?
  • Jak dodać element do tablicy PHP?
  • Jak usuwać elementy z tablic PHP?
  • Jaka jest różnica między konstrukcjami array() i [] w PHP?
  • Jak sprawdzić długość tablicy?

Zacznę od udzielenia odpowiedzi na trzy pierwsze pytania.

Czym jest tablica PHP

Tablice PHP (ang. array) to bardzo wszechstronne struktury danych, które można porównać do słownika albo książki telefonicznej. Tak jak w słowniku mamy hasła i definicje, tak w tablicy PHP mamy klucze i wartości.

Choć formalnie w PHP nie rozróżnia się rodzajów tablic, są po prostu tablice i już, to czasami mówi się o tablicach asocjacyjnych i indeksowanych numerycznie. Nie różnią się one między sobą pod względem budowy wewnętrznej, a jedynie pod względem zawartości.

Krótko mówiąc, każda tablica PHP jest tablicą asocjacyjną, czyli strukturą danych, która na wzór słownika przechowuje pary klucz-wartość.

Tablica indeksowana numerycznie jest tylko jej specyficznym rodzajem, w którym klucze (ang. key) są zazwyczaj kolejnymi liczbami całkowitymi, odliczanymi od 0.

Struktura danych, która ma postać ciągłego szeregu wartości ponumerowanych kolejnymi liczbami, fachowo nazywa się listą (ang. list) albo wektorem (ang. vector) i jest to struktura jednowymiarowa. Spójrz na poniższą ilustrację.

tablice php, lista php, struktury danych php
Tablica indeksowana numerycznie w PHP jest listą

W języku PHP istnieje nawet specjalna funkcja o nazwie array_is_list(), która sprawdza, czy dana tablica jest listą. Poniżej dla porównania przedstawiam analogiczny schemat przedstawiający tablicę asocjacyjną, w której indeksami są łańcuchy (tu jednoliterowe).

tablica asocjacyjna php, struktury danych php
Tablica asocjacyjna PHP

Gdybyśmy do którejkolwiek z tych list dołożyli drugi rząd wartości, to otrzymalibyśmy strukturę podobną do tabeli, czyli tablicę dwuwymiarową. PHP mógłby „widzieć” mniej więcej coś takiego:

tablice php, tablica dwuwymiarowa, struktury danych php
Tablica dwuwymiarowa w PHP może być indeksowana nie tylko numerycznie

W języku PHP można tworzyć tablice o dowolnej liczbie wymiarów, choć najczęściej spotyka się jedno- i dwuwymiarowe. W tej części kursu skupiam się na tablicach jednowymiarowych, a dokładny opis tablic wielowymiarowych zamieściłem w rozdziale Tablice wielowymiarowe PHP.

Skoro już wiesz, czym jest tablica PHP i jakie rodzaje tablic są dostępne w tym języku, pora poznać szczegóły technik ich tworzenia i przetwarzania (piszę „szczegóły”, ponieważ podstawy już znasz z wcześniejszych rozdziałów).

Tworzenie tablic w PHP

Tablice każdego rodzaju w PHP można tworzyć na dwa sposoby: za pomocą konstrukcji językowej PHP array() i przy użyciu krótszej składni, z wykorzystaniem operatora []. W obu przypadkach należy przekazać listę rozdzielanych przecinkami par klucz => wartość, np.:


$scores = array(
    "Jan Kowalski" => 127, // Klucz: "Jan Kowalski", wartość: 127
    "Andrzej Nowak" => 246, // Klucz: "Andrzej Nowak", wartość: "246"
    "Anna Kwiatkowska" => 300, // Klucz: "Anna Kwiatkowska", wartość: 300
);

$scores = [
    "Jan Kowalski" => 127,
    "Andrzej Nowak" => 246,
    "Anna Kwiatkowska" => 300,
];

Kluczem tablicy może być liczba całkowita (int) lub łańcuch (string). Natomiast wartości mogą być dowolnego typu obsługiwanego przez PHP.

Zarówno typy kluczy, jak i typy wartości można mieszać. To znaczy, jedna tablica może zawierać zarówno klucze liczbowe, jak i łańcuchowe oraz wartości różnego typu, np.:


$test = [
    "Jan Kowalski" => 127, // Klucz typu string, wartość typu int
    4 => 2.7, // Klucz typu int, wartość typu float
    8 => "osiem", // Klucz typu int, wartość typu string
];

Ponadto w definicjach tablic PHP nie ma obowiązku podawania kluczy. Jeśli któryś zostanie pominięty, to PHP nada mu najniższą dostępną wartość całkowitoliczbową (int), zaczynając od 0 i uwzględniając ewentualne występujące „po drodze” klucze całkowitoliczbowe, np.:


$test = [
         127, // Klucz 0, wartość 127
    4 => 2.7, // Klucz 4, wartość 2.7
         "osiem", // Klucz 5, wartość osiem
];

W tej tablicy wartości 127 nie przypisałem klucza, więc automatycznie został jej nadany pierwszy dostępny klucz całkowitoliczbowy, czyli w tym przypadku 0.

Wartość 2.7 ma wprost przypisany przeze mnie klucz 4.

Natomiast wartość "osiem" w tej tablicy ma klucz 5, ponieważ jest to najmniejsza liczba całkowita większa od poprzedniej całkowitoliczbowej wartości klucza w tej tablicy. Poniższy schemat przedstawia strukturę tej tablicy wizualnie:

tablice php, pomijanie kluczy tablic php
W tej tablicy wartości indeksów 1, 2 i 3 nie istnieją

Skoro brakujące klucze są nadawane automatycznie, to listę (czyli tablicę indeksowaną numerycznie w sposób ciągły od 0) można utworzyć w uproszczony sposób, z którego korzystałem już kilkukrotnie we wcześniejszych częściach tego kursu, np.:


$cheerfulMusic = [
    0 => "Marilyn Manson",
    1 => "Sopor Aeternus",
    2 => "Murkrat",
];

Ta definicja tablicy jest równoważna z poniższą:


$cheerfulMusic = ["Marilyn Manson", "Sopor Aeternus", "Murkrat"];
Ujemne wartości kluczy — klucze tablic w PHP mogą mieć też wartości ujemne, np. [-10 => "abc"].

Metody tworzenia tablic PHP mamy z głowy, więc teraz pokażę ci, jak korzystać z tych struktur w praktyce. Zaczniemy od prostego wyświetlania ich zawartości.

Wyświetlanie zawartości tablicy PHP

Całą zawartość tablicy PHP można wyświetlić na stronie na kilka sposobów, między innymi za pomocą funkcji var_dump() i print_r().

Funkcję var_dump() już znasz. Wyświetla ona na ekranie zrzut informacji o zmiennej. Zrzut ten jest szczegółowy, tzn. zawiera wszystkie dostępne dane, a więc typ zmiennej, typy jej wartości, jeśli jest to zmienna typu złożonego, wartość lub wartości itd.

Natomiast funkcja print_r() drukuje informacje o zmiennej w czytelnej, nieco uboższej, formie i umożliwia także ich zwrócenie, aby można je było zapisać jako łańcuch w zmiennej.

Weźmy na przykład zdefiniowaną wcześniej tablicę $test:


$test = [
         127, // Klucz 0, wartość 127
    4 => 2.7, // Klucz 4, wartość 2.7
         "osiem", // Klucz 5, wartość osiem
];

Wynik wywołania funkcji var_dump($test); na stronie internetowej:


array(3) { [0]=> int(127) [4]=> float(2.7) [5]=> string(5) "osiem" }

Wynik wywołania funkcji print_r($test); na stronie internetowej:


Array ( [0] => 127 [4] => 2.7 [5] => osiem )

Tak naprawdę wyniki obu tych funkcji niewiele różnią się czytelnością, więc wybór jednej z nich to raczej kwestia gustu lub ewentualnie potrzeby zapisania wyniku w zmiennej.

Jeśli chcesz, aby wyniki te były bardziej czytelne, możesz je umieścić w elemencie HTML pre, który zachowa formatowanie tekstowe zwróconych danych w oryginalnej formie, np.:


echo "<pre>";
print_r($test);
echo "</pre>";

Efekt jest całkiem przyjemny dla oka:

Alt: efekt dodania elementu HTML pre do wyniku funkcji print_r Desc: Dzięki użyciu elementu pre wynik funkcji print_r jest znacznie milszy dla oka

Kiedy już się napatrzysz i nacieszysz urodą całej swojej tablicy, to pewnie zaczniesz się zastanawiać, czy można uzyskać dostęp tylko do jej wybranych elementów. Oczywiście można i już to robiliśmy, a służy do tego operator [].

Dostęp do elementów tablicy

Aby uzyskać dostęp do dowolnego elementu tablicy PHP, należy napisać nazwę zmiennej reprezentującej tę tablicę, a po niej należy wpisać indeks lub klucz wybranego elementu w nawiasie prostokątnym ([]), np.:


$cheerfulMusic = [
    0 => "Marilyn Manson",
    1 => "Sopor Aeternus",
    2 => "Murkrat",
];

echo $cheerfulMusic[2]; // Wynik: "Murkrat"

W razie potrzeby wartość wyrażenia typu $cheerfulMusic[2] można zapisać w zmiennej, aby móc się nią wygodniej posługiwać w innych częściach skryptu. Ewentualnie można posługiwać się bezpośrednio wyrażeniem $cheerfulMusic[2], np.:


echo strlen($cheerfulMusic[1]);

$band = $cheerfulMusic[1];
echo strlen($band);

Obie formy są równoważne, ale jeśli zamierzasz używać wartości częściej niż raz, to zapewne poręczniej będzie ci posługiwać się „zwykłą” zmienną.

Kiedy utworzymy tablicę, to czasami chcielibyśmy jeszcze coś do niej dodać albo coś z niej usunąć. Teraz pokażę ci, jak robić takie cuda z tablicami.

Dodawanie elementów do tablicy

Elementy do tablicy można dodawać w różnych miejscach, choć najczęściej dodaje się je na początku lub na końcu. Najpierw pokażę ci, jak dodawać elementu na końcu.

Dodawanie elementów na końcu

Jeśli chcesz dodać tylko jeden element na końcu tablicy, to najlepszym sposobem (ponieważ niewymagającym „kosztownego” wywołania funkcji) jest użycie poniższej składni:

$tablica[] = wartość;

Wartością może być literał lub zmienna dowolnego typu. Cokolwiek to będzie, zostanie dodane na końcu tablicy pod pierwszym wolnym indeksem numerycznym, np.:


$deliciousFood = ["golonka", "flaki", "inne przysmaki"];

$deliciousFood[] = "kaszanka";

print_r($deliciousFood);

Wynik:


Array
(
    [0] => golonka
    [1] => flaki
    [2] => inne przysmaki
    [3] => kaszanka
)

Oczywiście możesz też wybrać klucz, pod którym chcesz zapisać kolejny element tablicy, np.:


$deliciousFood["słodki deser"] = "kaszanka";

Wynik:


Array
(
    [0] => golonka
    [1] => flaki
    [2] => inne przysmaki
    [słodki deser] => kaszanka
)

W ten sposób bez problemu dodamy jeden element na końcu tablicy. A jeśli chcielibyśmy dodać więcej? Wtedy lepszym rozwiązaniem niż wielokrotne użycie opisanej składni może być użycie funkcji array_push() (albo pętli PHP).

Funkcja ta w pierwszym argumencie przyjmuje nazwę tablicy, do której mają zostać dodane elementy, oraz dowolną liczbę dalszych argumentów, które są elementami do dodania na końcu tej tablicy, np.:


array_push($deliciousFood, "kaszanka", "kartofle");

Efekt:


Array
(
    [0] => golonka
    [1] => flaki
    [2] => inne przysmaki
    [3] => kaszanka
    [4] => kartofle
)

Jeśli chcesz dodać kilka par klucz => wartość do tablicy, to możesz utworzyć z nich tablicę i dodać je za pomocą funkcji PHP array_merge() albo przy użyciu tablicowego operatora dodawania, np.:


print_r(array_map(null, $fruit, $sweets, $meat));

$person = [
    "name" => "Jan",
    "surname" => "Kowalski",
    "phone" => "123 456 789",
];

$person += [
    "nationality" => "Polish",
    "gender" => "Male",
    "email" => "abc@def.gh",
];

print_r($person);

Wynik:


Array
(
    [name] => Jan
    [surname] => Kowalski
    [phone] => 123 456 789
    [nationality] => Polish
    [gender] => Male
    [email] => abc@def.gh
)

Teraz przyjrzymy się metodom dodawania elementów na początku tablicy.

Dodawanie elementów na początku tablicy

Aby dodać jeden lub więcej elementów na początku tablicy, można posłużyć się funkcją PHP array_unshift. Jako argumenty przyjmuje ona tablicę, która ma zostać zmodyfikowana, oraz dowolną liczbę elementów, które mają zostać do niej dodane, np.:


$fruit = ["gruszka", "jabłko", "wiśnia"];

array_unshift($fruit, "arbuz", "morela");

print_r($fruit);

Wynik:


Array
(
    [0] => arbuz
    [1] => morela
    [2] => gruszka
    [3] => jabłko
    [4] => wiśnia
)
Uwaga: pamiętaj, że przy dodawaniu elementów na początku tablicy indeksowanej numerycznie za pomocą funkcji array_unshift() następuje zmiana wartości indeksów.

Jeśli jednak chcesz dodać elementy na początku tablicy asocjacyjnej, to funkcja array_unshift nie będzie dobrym wyborem. W takim przypadku lepiej jest posłużyć się tablicowym operatorem dodawania.

Elementy do dodania można umieścić w tablicy, a następnie dodać ją na początku tablicy, którą chcesz zmodyfikować, np.:


$person = [
    "name" => "Jan",
    "surname" => "Kowalski",
    "phone" => "123 456 789",
];

$add = [
    "nationality" => "Polish",
    "gender" => "Male",
    "email" => "abc@def.gh",
];

$person = $add + $person;

print_r($person);

A czy można dodawać elementy w środku tablicy? Oczywiście!

Dodawanie elementów w środku

W języku PHP nie ma funkcji, która bezpośrednio została stworzona do dodawania elementów w środku tablicy, ale jeśli chodzi o tablice indeksowane numerycznie, to można do tego celu wykorzystać funkcję array_splice().

W takim przypadku funkcji array_splice() należy przekazać 4 argumenty w następującej kolejności:

  1. Nazwa tablicy do zmodyfikowania
  2. Indeks pozycji, na której ma zostać wstawiony element
  3. 0 oznaczające, że chcemy usunąć zero elementów
  4. Wartość wstawianego elementu

Na przykład:


$fruit = ["gruszka", "jabłko", "wiśnia", "arbuz", "morela"];

array_splice($fruit, 2, 0, "brzoskwinia");

print_r($fruit);

Efekt:


Array
(
    [0] => gruszka
    [1] => jabłko
    [2] => brzoskwinia
    [3] => wiśnia
    [4] => arbuz
    [5] => morela
)

W przypadku tablic asocjacyjnych sprawa jest trochę bardziej skomplikowana, ale nie beznadziejna. Jeden ze sposobów polega na użyciu funkcji array_slice(), array_merge() i array_search(), których opis znajdziesz na stronach Funkcja PHP array_slice, Funkcja PHP array_merge i Funkcja PHP array_search(). Pozostawiam to jako ćwiczenie do samodzielnego wykonania.

Rozpakowywanie tablic

W języku PHP dostępny jest także operator ... (ang. spread operator — operator rozpakowywania), za pomocą którego można wykonywać tzw. operację rozpakowywania tablic (ang. array unpacking).

Polega ona na tym, że tablicę można utworzyć z dowolnej liczby innych tablic przez „wypakowanie” ich zwartości w miejscu wskazanym przez operator ..., np.:


$a = [1, 2, 3];
$b = [4, 5, 6];

$c = [...$a, ...$b];

print_r($c);

Wynik:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

Tablica $c została utworzona z elementów tablic $a i $b. Technika ta pozwala na dowolne mieszanie pojedynczych elementów z wypakowywanymi tablicami oraz działa także w przypadku tablic asocjacyjnych, np.:


$c = [...$a, "k" => 24, ...$b, "l" => "łańcuch"];

Teraz nasza tablica będzie wyglądała tak:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [k] => 24
    [3] => 4
    [4] => 5
    [5] => 6
    [l] => łańcuch
)

Kiedy dodasz do tablicy mnóstwo elementów, możesz stwierdzić, że już wystarczy i możesz zechcieć niektórych się pozbyć. Teraz pokażę ci, jak usuwać niechciane (albo chciane, jeśli się pomylisz) elementy z tablicy PHP.

Usuwanie elementów z tablicy

Elementy z tablic można usuwać na wiele sposobów, a wybór konkretnego z nich zależy od sytuacji, potrzeby i rodzaju tablicy. Zaczniemy od usuwania elementów pojedynczo.

Usuwanie elementów pojedynczo

Jedną z najprostszych i najczęściej stosowanych metod usuwania elementów z tablicy jest użycie konstrukcji językowej PHP unset(). Przyjmuje ona dowolną liczbę zmiennych do usunięcia, którymi mogą być także elementy tablicy, np.:


$person = [
    "name" => "Jan",
    "surname" => "Kowalski",
    "phone" => "123 456 789",
];

unset($person["name"], $person["surname"]);

print_r($person);

Efekt:


Array
(
    [phone] => 123 456 789
)

Podczas używania konstrukcji unset() z tablicami indeksowanymi numerycznie należy pamiętać, że nie reorganizuje ona indeksów, więc po usuniętych elementach pozostaną „dziury”, np.:


$fruit = ["gruszka", "jabłko", "wiśnia", "arbuz", "morela"];

unset($fruit[1], $fruit[3]);

print_r($fruit);

Efekt:


Array
(
    [0] => gruszka
    [2] => wiśnia
    [4] => morela
)

W konstrukcji unset() każdy element przeznaczony do usunięcia trzeba wskazać wprost. Jeśli więc chcesz usunąć kilka elementów znajdujących się obok siebie, lepszym wyborem będzie użycie funkcji array_splice().

Seryjne usuwanie elementów

Aby usunąć kilka kolejnych elementów z tablicy za pomocą funkcji array_splice(), należy przekazać jej trzy argumenty: tablicę do zmodyfikowania, numer pierwszego elementu i numer ostatniego elementu ciągu do usunięcia, np.:


$fruit = ["gruszka", "jabłko", "wiśnia", "arbuz", "morela"];

array_splice($fruit, 1, 3);

print_r($fruit);

Efekt:

Array
(
  [0] => gruszka
  [1] => morela
)

Zauważ, że funkcja ta reorganizuje indeksowanie tablicy. Ponadto umożliwia ona zastąpienie usuwanych elementów innymi, ale pamiętaj, że nie działa z tablicami asocjacyjnymi.

Czasami przydaje się możliwość szybkiego i wygodnego usunięcia pierwszego lub ostatniego elementu z tablicy. Służą do tego odpowiednio funkcje array_shift() i array_pop().

Usuwanie ostatniego elementu

Ostatni element tablicy w PHP można usunąć za pomocą funkcji array_pop(). Działa ona na każdym rodzaju tablic, np.:


$person = [
    "name" => "Jan",
    "surname" => "Kowalski",
    "phone" => "123 456 789",
];

array_pop($person);

print_r($person);

Efekt:

Array
(
    [name] => Jan
    [surname] => Kowalski
)

Usuwanie pierwszego elementu

Do wygodnego usuwania pierwszego elementu tablicy w PHP służy funkcja array_shift(), która jako argument przyjmuje oczywiście tablicę (dowolnego rodzaju) przeznaczoną do modyfikacji, np.:


$person = [
    "name" => "Jan",
    "surname" => "Kowalski",
    "phone" => "123 456 789",
];

array_shift($person);

print_r($person);

Efekt:

Array
(
    [surname] => Kowalski
    [phone] => 123 456 789
)

Modyfikowanie elementów tablicy

Najprostszym sposobem na zmodyfikowanie elementu tablicy jest oczywiście użycie znanej ci już składni z operatorem [], np.:


$fruit = ["gruszka", "jabłko", "wiśnia"];
$fruit[1] = "morela";

Efekt:

Array
(
    [0] => gruszka
    [1] => morela
    [2] => wiśnia
)

Jednak ten sposób jest dobry, gdy chcemy zmodyfikować jeden lub dwa elementy. Gdy operację trzeba wykonać na większej liczbie elementów, lepiej jest użyć pętli (o czym za chwilę) albo specjalnej funkcji PHP, która służy do tego celu, np. array_map().

W najprostszej formie funkcja PHP array_map() przyjmuje funkcję zwrotną w pierwszym argumencie i tablicę w drugim, po czym wykonuje tę funkcję zwrotną na każdym elemencie tablicy, np.:


$numbers = [1, 2, 3, 4, 5];

function db($x) {
  return $x * 2;
}

$numbers = array_map("db", $numbers);

print_r($numbers);

Wynik:

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

Funkcja array_map() ma znacznie szersze możliwości niż pokazałem tutaj. Jej szczegółowy opis znajduje się na stronie Funkcja PHP array_map().

Jak już wspomniałem, tablice można też modyfikować za pomocą pętli. Jest to tak często wykonywana operacja, że w języku PHP udostępniono nawet specjalną pętlę do pracy z tablicami o nazwie foreach. Przyjrzymy się jej teraz.

Przeglądanie tablic za pomocą pętli foreach

Tablice można przeglądać i modyfikować za pomocą każdej pętli PHP, ale pętla PHP foreach została stworzona specjalnie do tego celu. Dlatego w tej sekcji skupiam się właśnie na niej. Jeśli chcesz dowiedzieć się, jak można pracować z tablicami za pomocą pętli while i for, zobacz Pętla PHP while i Pętla PHP for.

Podstawowe wiadomości o pętli foreach znajdują się w rozdziale poświęconym pętlom w sekcji Pętla PHP foreach. Opisałem tam sposoby pracy za pomocą pętli foreach z tablicami indeksowanymi numerycznie, więc nie będę się już powtarzał i od razu przejdę do omówienia wersji składni dla tablic asocjacyjnych.

Wersja pętli PHP foreach do pracy z tablicami asocjacyjnymi ma następującą składnię:

foreach (tablica as $klucz => $wartość) {...}

Pętla ta przegląda tablicę przekazaną jako argument tablica. W każdej iteracji zmiennym $klucz i $wartość przypisuje parami kolejne klucze i wartości z tej tablicy. W bloku kodu można na tych parach wykonywać dowolne działania.

Powiedzmy na przykład, że mamy taką tablicę, która zawiera informacje podane przez użytkownika podczas zakładania konta w serwisie i pobrane z bazy danych:


$person = [
    "Imię" => "Jan",
    "Nazwisko" => "Kowalski",
    "Telefon" => "123 456 789",
];

Teraz użytkownik ten zalogował się na swoje konto i chce edytować swój profil. W profilu tym wyświetlony jest formularz HTML zawierający wcześniej podane przez niego informacje. Jak wypełnić te pola obecnymi danymi użytkownika? Zrobimy to za pomocą pętli foreach.

Pola formularza, które są nam potrzebne, reprezentują elementy HTML label i intput. Po zakończeniu działania pętli powinny one wyglądać tak:


<label>Imię: <input name="name"></label>
<label>Nazwisko: <input name="surname"></label>
<label>Telefon: <input name="phone"></label>

Z pętlą foreach wygenerowanie takiego formularza HTML będzie bardzo proste. Spójrz:


<?php
$person = [
  "Imię" => "Jan",
  "Nazwisko" => "Kowalski",
  "Telefon" => "123 456 789",
];

?>

<?php foreach ($person as $key => $value):

  if ($key == "Imię") $name = "name";
  if ($key == "Nazwisko") $name = "surname";
  if ($key == "Telefon") $name = "telephone";
?>

  <label><?php echo $key; ?>: <input name="<?php echo $name; ?>" value="<?php echo $value; ?>"></label>

<?php endforeach; ?>

Zastosowałem tu alternatywną składnię pętli PHP foreach. Za pomocą tej pętli foreach pobieram klucze i wartości z tablicy, po czym ustawiam je jako wartości odpowiednich elementów. To bardzo prosty skrypt.

Oczywiście nie musisz ograniczać się tylko do wyświetlania kluczy i wartości, możesz też wykonywać na nich dowolne inne operacje.

W poprzednim przykładzie pokazałem, jak przejrzeć tablicę za pomocą pętli foreach i użyć jej zawartości do pewnego celu bez modyfikowania oryginału. Chodzi mi o to, że po zakończeniu działania pętli zawartość tablicy $person pozostaje niezmieniona.

A gdybym chciał zmodyfikować oryginalną tablicę? Powiedzmy na przykład, że otrzymaliśmy tablicę danych z błędem, który chcielibyśmy poprawić:


$zwierzaki = [
  "Turkuć podjadek" => "Owat",
  "Komarzyca" => "Owat",
  "Złodziejaszek rypidełko" => "Owat",
];

Jest to tablica, w której kluczami są nazwy zwierząt, a wartościami nazwy gatunków do jakich się zaliczają. Niestety ktoś się pomylił i błędnie napisał Owat. Poprawimy to za pomocą pętli foreach.

Tym razem jednak delikatnie zmienimy strategię. Skoro chcemy modyfikować oryginalną tablicę, to jej wartości do pętli musimy przekazywać przez referencję, a nie przez wartość. Dlatego przed zmienną $value wstawimy znak &:


$zwierzaki = [
  "Turkuć podjadek" => "Owat",
  "Komarzyca" => "Owat",
  "Złodziejaszek rypidełko" => "Owat",
];


foreach ($zwierzaki as $key => &$value):

  if ($value === "Owat") $value = "Ofat";

endforeach;
unset($value);

print_r($zwierzaki);

Efekt:

Array
(
    [Turkuć podjadek] => Ofat
    [Komarzyca] => Ofat
    [Złodziejaszek rypidełko] => Ofat
)

A teraz przyjrzymy się metodom sortowania tablic.

Sortowanie tablic PHP

W języku PHP dostępny jest dość pokaźny zestaw funkcji do sortowania tablic na różne sposoby. Można na przykład sortować tablice według kluczy w kolejności rosnącej lub malejącej (odpowiednio za pomocą funkcji krsort() i ksort()), przy użyciu zdefiniowanej przez użytkownika funkcji porównywania (uasort()), według wartości za pomocą funkcji porównującej zdefiniowanej przez użytkownika (usort()) itd.

Praca z funkcjami sortowania w PHP jest prosta, więc przedstawiam tylko jeden przykład, aby pokazać ci, jak się do tego zabrać.

Weźmy na przykład tablicę smacznych potraw z wcześniejszego przykładu:


$deliciousFood = ["golonka", "flaki", "inne przysmaki", "kaszanka"];

Posortowanie takiej tablicy w kolejności rosnącej lub malejącej jest banalnie proste. W pierwszym przypadku możemy użyć funkcji PHP sort(), a w drugim — funkcji PHP rsort():


sort($deliciousFood);
print_r($deliciousFood);

lub:


rsort($deliciousFood);
print_r($deliciousFood);

Wynik:

Array
(
    [0] => flaki
    [1] => golonka
    [2] => inne przysmaki
    [3] => kaszanka
)

lub:

Array
(
    [0] => kaszanka
    [1] => inne przysmaki
    [2] => golonka
    [3] => flaki
)

Zwróć uwagę, że funkcja PHP sort() i funkcja PHP rsort() zmieniają indeksy elementów w sortowanych tablicach. Jeśli chcesz zachować indeksy, to możesz w taki sam sposób użyć funkcji asort() i arsort(). Na przykład wynik sortowania naszej przykładowej tablicy za pomocą wywołania funkcji asort($deliciousFood); byłby następujący:

Array
(
    [1] => flaki
    [0] => golonka
    [2] => inne przysmaki
    [3] => kaszanka
)

Jak widać, kolejność elementów została zmieniona, ale zachowały one swoje indeksy.

Poniżej znajduje się lista wszystkich funkcji sortujących tablice dostępnych w PHP.

  • krsort() — sortuje tablicę według kluczy w kolejności malejącej
  • ksort() — sortuje tablicę według kluczy w kolejności rosnącej
  • sort() — sortuje tablicę w kolejności rosnącej
  • uasort() — sortuje tablicę przy użyciu funkcji porównywania zdefiniowanej przez użytkownika i zachowuje indeksy elementów
  • uksort() — sortuje tablicę według kluczy przy użyciu funkcji porównywania zdefiniowanej przez użytkownika
  • usort() — sortuje tablicę według wartości przy użyciu funkcji zdefiniowanej przez użytkownika
  • rsort() — sortuje tablicę w kolejności malejącej
  • natsort() — sortuje tablicę przy użyciu algorytmu porządku naturalnego
  • natcasesort() — sortuje tablicę przy użyciu algorytmu porządku naturalnego bez rozróżniania wielkości liter
  • arsort() — sortuje tablicę w kolejności malejącej i zachowuje indeksy elementów
  • asort() — sortuje tablicę w kolejności rosnącej i zachowuje indeksy elementów
  • array_multisort() — sortuje kilka tablic lub tablice wielowymiarowe

Znasz już wszystkie podstawowe techniki pracy z tablicami jednowymiarowymi w PHP. W następnym rozdziale pokażę ci jak tworzyć i przetwarzać tablice wielowymiarowe PHP, ale zanim do niego przejdziemy, rzuć jeszcze okiem na tabelę operatorów tablicowych.

Są to „zwykłe” operatory porównań i operator dodawania, które w odniesieniu do tablic mają specjalne znaczenie. Warto je znać.

Operatory tablicowe PHP

Zestawienie operatorów tablicowych PHP
Operator Nazwa Przykład Wynik
+ Suma $a + $b Zawartość tablicy $b zostanie dołączona na końcu tablicy $a, ale elementy o powtarzających się indeksach zostaną odrzucone
== Równość $a == $b Wartość true, jeśli tablice $a i $b zawierają takie same pary kluczy i wartości
=== Identyczność $a === $b Wartość true, jeśli tablice $a i $b zawierają takie same pary kluczy i wartości, które są tych samych typów i w tej samej kolejności
!= / <> Nierówność $a != $b Wartość true, jeśli tablica $a nie zawiera takich samych elementów, jak tablica $b
!== Nierówność ścisła $a !== $b Wartość true, jeśli tablice $a i $b nie zawierają takich samych elementów, tych samych typów i w tej samej kolejności

Poniżej przedstawiam przykłady użycia każdego z tych operatorów.

Operator sumy tablic

Operator tablicowy + zasługuje na największą uwagę spośród wszystkich operatorów tablicowych, ponieważ przez nieuwagę za jego pomocą można łatwo otrzymać niepoprawny wynik. Spójrz na poniższy przykład:


$a = [1, 2, 3, 4];
$b = ["a", "b", "c", "d"];

$c = $a + $b;

print_r($c);

Jakiego wyniku się spodziewasz? Że tablica $c będzie zawierała 8 elementów? Jeśli tak, to spójrz poniżej (zresztą, jeśli nie, to też spójrz):

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Żaden z elementów tablicy $b nie został dodany do tablicy $a, ponieważ tablice te mają identyczne klucze. A teraz spójrz na poniższy przykład:


$a = [1, 2, 3, 4];
$b = [4 => "a", "b", "c", "d"];

$c = $a + $b;

print_r($c);

Wynik:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => a
    [5] => b
    [6] => c
    [7] => d
)

Teraz numery indeksów tablicy $b zaczynają się od 4, a więc są inne niż w tablicy $a, dlatego tablice zostały zsumowane.

Operatory porównań

Operatory porównań nie sprawiają większych niespodzianek, więc poniżej przedstawiam tylko po jednym prostym przykładzie użycia każdego z nich.


$a = [1, 2, 3, 4];
$b = ["1", "2", "3", "4"];

echo $a == $b ? "Prawda" : "Fałsz"; // Wynik: Prawda
echo $a === $b ? "Prawda" : "Fałsz"; // Wynik: Fałsz
echo $a != $b ? "Prawda" : "Fałsz"; // Wynik: Fałsz
echo $a !== $b ? "Prawda" : "Fałsz"; // Wynik: Prawda

W tych przykładach użyłem operatora trójargumentowego PHP. Jeśli potrzebujesz odświeżenia pamięci, zobacz: Operator trójargumentowy PHP.

Na tym zakończymy ten rozdział. Jeśli jeszcze ci mało, to zachęcam cię do przeczytania następnego, w którym opisałem tablice wielowymiarowe w PHP.

Podsumowanie

blank
  1. Tablica PHP to struktura danych umożliwiająca przechowywanie wartości dowolnego typu.
  2. Każda tablica PHP zawiera pary klucz-wartość.
  3. Klucze mogą być tylko typu int lub string. Klucze niektórych innych typów są przez PHP niejawnie konwertowane.
  4. Tablica asocjacyjna wiąże klucze z wartościami, jak np. słownik.
  5. Tablica indeksowana numerycznie to także tablica asocjacyjna, w której wszystkie klucze są liczbami całkowitymi.
  6. Elementy tablicy w PHP można dodawać, usuwać i modyfikować na wiele różnych sposobów za pomocą operatora [] oraz licznych standardowych funkcji tablicowych PHP.
  7. Operatory tablicowe PHP to operator dodawania + i operatory porównań PHP, które w odniesieniu do tablic mają specjalny sposób działania.


blank

Pytania

  1. Czym jest tablica PHP?
  2. Jakie wartości można przechowywać w tablicy PHP?
  3. Jakiego typu mogą być klucze w tablicach PHP?
  4. Czym jest tablica asocjacyjna i indeksowana numerycznie? Jaka jest między nimi różnica?
  5. Jakie operacje można wykonywać na tablicach w PHP?
  6. Czym są operatory tablicowe?


blank

Ćwiczenia

  1. Utwórz dowolnie długą indeksowaną numerycznie tablicę tytułów książek.
  2. Zamień tablicę z poprzedniego ćwiczenia w tablicę asocjacyjną, przez dodanie imion i nazwisk autorów jako kluczy.
  3. Dodaj na końcu swojej tablicy asocjacyjnej jeden element.
  4. Dodaj na początku swojej tablicy asocjacyjnej jeden element.
  5. Dodaj jeden element w środku swojej tablicy indeksowanej numerycznie.
  6. Usuń pierwszy element ze swojej tablicy asocjacyjnej.
  7. Usuń ostatni element ze swojej tablicy asocjacyjnej.
  8. Usuń dowolnie długą serię elementów ze swojej tablicy indeksowanej numerycznie.
  9. Za pomocą pętli foreach przejrzyj swoją tablicę asocjacyjną i zamień klucze i wartości miejscami. To znaczy, niech kluczami będą tytuły książek, a wartościami imiona i nazwiska autorów.
  10. Połącz swoją tablicę asocjacyjną z tablicą indeksowaną numerycznie.
  11. Napisz funkcję wstawiającą parę klucz-wartość w dowolnym miejscu tablicy asocjacyjnej. Funkcja ta powinna przyjmować następujące argumenty:
    1. Nazwa tablicy do modyfikacji
    2. Klucz i wartość, które mają zostać do niej wstawione
    3. Klucz wartości, po której mają one zostać wstawione.
Udostępnij:
Share

Podobał Ci się ten artykuł?

Oceń go!

Średnia 5 / 5. Liczba głosów: 4

Jeszcze nikt nie głosował. Wyprzedź innych i zagłosuj.

Skoro spodobał Ci się ten artykuł...

Poleć go znajomym!

Ojej :( Powiedz nam, co powinniśmy poprawić!

blank
Podoba Ci się ta strona?

Pomóż nam się rozwijać, wykupując płatne konto. Dzięki temu będziemy mogli tworzyć dla Ciebie jeszcze więcej ciekawych treści, a Ty pozbędziesz się reklam.

Dodaj komentarz