Praktycznie zastosowanie funkcji tablic

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.

Dodaj komentarz

Please Login to comment

Zobacz również artykuły o podobnej tematyce

ORI – czy Twój biznes jest gotowy na omnichannel?

Pojęcie omnichannelu znamy już właściwie wszyscy, nie tylko w teorii, ale również w praktyce. Taka synergia wszystkich, wykorzystywanych przez markę...

Efekt ROPO – co może zagwarantować Twojej firmie?

Relacje między marką a klientem zmieniają się bardzo dynamicznie. Współcześnie są one zupełnie inne niż 5, 10, czy 20 lat...

Magia e-commerce, czyli ludzka psychika a wydatki

Żyjemy w czasach, gdzie półki uginają się pod ciężarem wyłożonych na nich towarów, a każdy produkt jest w zasadzie “na...

Zobacz więcej wpisów