Funkcje tablic to bardzo bogate narzędzia ułatwiające pracę programisty PHP. Możemy przy ich pomocy modyfikować zawartość tablicy, sortować, wykonywać na każdym elemencie jakąś instrukcję czy też dowolnie przekształcać. W poniższym wpisie chciałbym przedstawić kilka praktycznych przykładów pokazujących w czym te funkcje mogą nam się przydać. Przykłady te nie wyczerpują tematu, ale mam nadzieję, że chociaż w minimalnym stopniu zaznajomią z tematem.
Umieszczanie elementu w środku tablicy
Wyobraźmy sobie sytuację, w której chcemy dodać nowy element do tablicy. Aby dopisać element na końcu tablicy możemy użyć array_push, na początku używamy array_shift, a co żeby umiescić element gdzieś w środku tablicy? Z pomocą przychodzi nam funkcja array_splice, która służy do usunięcia części tablicy i zamienia ją na coś innego.
<?php $arr = ['A', 'B', 'D']; array_splice($arr, 2, 0, ['C']); print_r($arr);
W powyższym przykładzie mamy tablicę, w której znajdują się kolejne elementy alfabetu z jedną brakująca literą. Aby poprawić nasz alfabet usuwamy „zero” elementów i dodajemy brakujące C. Dla powyższego kodu otrzymamy poprawne i kompletne pierwsze cztery litery alfabetu.
Array ( [0] => A [1] => B [2] => C [3] => D )
Usuwanie elementów
Jeśli chodzi o usuwanie pierwszego i ostatniego elementu tablicy to możemy posłużyć się funkcjami array_pop oraz array_unshift, ale przypuśćmy, że chcemy usunąć jakiś obiekt z tablicy wskazując jego właściwości. Przykładwo chcemy usunąć obiekt instancji klasy Foo który posiada id 18.
<?php class Foo { private $id; public function __construct($id) { $this->id = $id; } public function getId() { return $this->id; } } $arr = [new Foo(17), new Foo(18), new Foo(16)]; $idToDelete = 18; $result = array_filter($arr, function(Foo $foo) use($idToDelete) { return $foo->getId() !== $idToDelete; });
Wykorzystując funkcję array_filter w zmiennej $result mamy tablicę bez obiektu o id 18. array_filter wywoływana bez parametrów zwróci tablice usuwając z tej wejściowej takie elementy jak w puste stringi oraz null.
Posiadając tablicę składającą się z typów prostych takich jak np string możemy wykorzystać funkcję array_search, która pozwoli nam wyszukać index w tablicy pod którym znajduje się dany element.
<?php $arr = ['A', 'B', 'X', 'C']; if (($key = array_search('X', $arr, $strict = true)) !== FALSE) { unset($arr[$key]); } print_r($arr);
W wyniku wywołania powyższego kodu otrzymamy tablicę bez 'iksa’.
Array ( [0] => A [1] => B [3] => C )
Jeśli problematyczne okaże się to, że nie mamy ciągłości w kluczach tablicy (brakuje wartości pod drugim indeksem) możemy wykorzystać funkcję array_values.
$arr = array_values($arr);
Dopisanie powyższego kodu za klamrą zamykającą z warunku w poprzednim przykładzie zmieni wynik na taki posiadający ciągłość w kluczach.
Array ( [0] => A [1] => B [2] => C )
Sortowanie tablicy po wartości obiektu
Dla prostych, jednowymiarowych tablic mamy szereg funkcji pozwalających na posortowanie jej. Dzielą się one na te które sortują po kluczach lub wartościach lub też definiują kierunek w którym elementy zostaną posortowane. Takimi funkcjami są m. in. asort, ksort, arsort, krsort itd.
<?php class Foo { public $id; public function __construct($id) { $this->id = $id; } } $arr = [new Foo(17), new Foo(18), new Foo(16)]; array_multisort( array_column($arr, 'id'), SORT_ASC, $arr ); print_r($arr);
W powyższym kodzie znajduje się prosta klasa Foo która posiada jedno publiczne pole $id inicjowane w konstruktorze. Wykorzystanie funkcji array_column pozwala zwrócić wartości z poszczególnych pól obiektu (PHP 7.0) lub kolumn w przypadku tablic asocjacyjnych. W połączeniu z funkcją array_multisort pomoże nam posortować tablice instancji Foo.
Array ( [0] => Foo Object ( [id] => 16 ) [1] => Foo Object ( [id] => 17 ) [2] => Foo Object ( [id] => 18 ) )
Alternatywną metodą do posortowania tablicy obiektów może być ta przedstawiona poniżej z użyciem funkcji uasort. Rezultat będzie taki sam jak dla kombinacji funkcji array_column i array_multisort.
uasort ($arr, function (Foo $a, Foo $b) { return $a->id > $b->id; });
Porównywanie tablicy
Sprawdzanie czy dwie tablice składają się tylko i wyłącznie z tych samych elementów w pewnych przypadkach może okazać się kłopotliwe.
<?php $foo = ['A', 'B']; $bar = ['B', 'A']; var_dump($foo === $bar);
Te tablice zawierają te same elementy, ale powyższy kod zwróci false z tego względu, że operator porównania w przypadku tablic sprawdza również zgodność kluczy. Możemy oczywiście te dwie tablice najpierw posortować, ale ciekawszym i w niektórych przypadkach lepszym rozwiązaniem jest porównanie różnic tablic przez wywołanie funkcji array_diff.
array_diff($foo, $bar) === array_diff($bar, $foo)
Znajdowanie maksymalnej wartości pola obiektu
Mamy sytuację w której chcemy poznać maksymalną wartość danego pola obiektu, np. najwyższą cenę produktu.
<?php class Product { private $price; public function __construct($price) { $this->price = $price; } public function getPrice() { return $this->price; } } $arr = [ new Product(2.00), new Product(3.45), new Product(1.23) ]; $max = max(array_map(function(Product $product) { return $product->getPrice(); }, $arr));
W rezultacie otrzymamy oczywiście 3.45. W powyższym przykładzie wykorzystaliśmy funkcję array_map która pozwoliła nam z każdego produktu wyciągnąć cenę. Jeśli posłużylibyśmy się tutaj obiektami z publicznymi właściwościami (lub tablicą) moglibyśmy wykorzystać wcześniej poznaną funkcję array_column.
Autorem tekstu jest Jakub Sładek.