Jak Usunąć z Tablicy Powtarzające Się Wartości w PHP?

0
162
Rate this post

Jeżeli pracujesz z językiem PHP, zapewne spotkałeś się z koniecznością obsługi tablic. Te kolekcje danych są jednym z filarów PHP i mają szerokie zastosowanie w różnych dziedzinach programowania. Jednym z częściej napotykanych problemów jest usunięcie powtarzających się wartości z tablicy. W tym artykule omówimy kilka metod, jak można to zrobić w PHP.

Podstawowe Metody

array_unique

Najbardziej podstawową i najłatwiejszą do zastosowania metodą jest użycie funkcji array_unique. Ta funkcja zwraca nową tablicę, która zawiera tylko unikatowe elementy.

php
$tablica = [1, 2, 2, 3, 4, 4, 5];
$unikalnaTablica = array_unique($tablica);
print_r($unikalnaTablica); // Wyjście: Array ( [0] => 1 [1] => 2 [3] => 3 [4] => 4 [6] => 5 )

Wartości indeksów są zachowane, co może być zarówno zaletą, jak i wadą, w zależności od kontekstu.

Pętla for lub foreach

Innym sposobem na usunięcie duplikatów jest ręczne przejście przez tablicę i przechowanie unikatowych wartości w nowej tablicy.

php
$tablica = [1, 2, 2, 3, 4, 4, 5];
$unikalnaTablica = [];

foreach ($tablica as $element) {
if (!in_array($element, $unikalnaTablica)) {
$unikalnaTablica[] = $element;
}
}

print_r($unikalnaTablica); // Wyjście: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

W tym przypadku mamy pełną kontrolę nad indeksami w nowej tablicy.

Zaawansowane Metody

array_flip i array_keys

Możesz również skorzystać z kombinacji array_flip i array_keys dla bardziej zaawansowanego usuwania duplikatów:

php
$tablica = [1, 2, 2, 3, 4, 4, 5];
$unikalnaTablica = array_keys(array_flip($tablica));
print_r($unikalnaTablica); // Wyjście: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

Funkcje Callback

Jeżeli masz do czynienia z bardziej skomplikowanymi strukturami danych, takimi jak tablice asocjacyjne, możesz użyć funkcji array_filter z funkcją callback do identyfikacji i usunięcia duplikatów.

php
$tablicaObiektow = [
['id' => 1, 'nazwa' => 'element1'],
['id' => 2, 'nazwa' => 'element2'],
['id' => 2, 'nazwa' => 'element2'],
['id' => 3, 'nazwa' => 'element3']
];

$unikalneId = [];
$unikalnaTablicaObiektow = array_filter($tablicaObiektow, function ($element) use (&$unikalneId) {
if (in_array($element['id'], $unikalneId)) {
return false;
}

$unikalneId[] = $element['id'];
return true;
});

print_r($unikalnaTablicaObiektow);

Ta metoda jest bardzo elastyczna i pozwala na dużą swobodę w definiowaniu, co uznajemy za „duplikat”.

Porównanie Metod

Różne metody mają różne zalety i wady, które można podsumować w następujący sposób:

  • array_unique jest najłatwiejszy w użyciu, ale zachowuje indeksy, co może być problematyczne.
  • Pętla for lub foreach daje dużą kontrolę, ale jest najmniej wydajna.
  • array_flip i array_keys są szybsze, ale działają tylko na prostych typach danych.
  • Funkcje callback są najbardziej elastyczne, ale również mogą być trudne do zrozumienia i utrzymania.

Każda z tych metod ma swoje miejsce i zastosowanie, a wybór metody zależy od konkretnej sytuacji i potrzeb.

Wydajność i Optymalizacja

Jeśli masz do czynienia z bardzo dużymi tablicami, wydajność może być kluczowym czynnikiem. W takim przypadku warto zastanowić się nad użyciem algorytmów sortowania przed usunięciem duplikatów lub zastosowaniem struktur danych zaprojektowanych do efektywnego przechowywania unikatowych wartości, takich jak zestawy (sets) w innych językach programowania.

Sortowanie Tablicy

Jeśli twoja tablica jest uporządkowana, operacja usunięcia duplikatów może być znacznie szybsza. Możesz użyć funkcji sortujących dostępnych w PHP, takich jak sort lub asort, a następnie przejść przez tablicę, usuwając sąsiednie duplikaty.

php
$tablica = [4, 2, 2, 8, 3, 3, 1];
sort($tablica);
$poprzedniElement = null;
$unikalnaTablica = [];

foreach ($tablica as $element) {
if ($element !== $poprzedniElement) {
$unikalnaTablica[] = $element;
}
$poprzedniElement = $element;
}

print_r($unikalnaTablica); // Wyjście: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 8 )

Użycie Bibliotek Zewnętrznych

Niektóre biblioteki i narzędzia są zoptymalizowane pod kątem różnych operacji na tablicach i kolekcjach. Biblioteki te, takie jak Laravel Collections, oferują wiele metod do manipulowania tablicami, w tym usunięcia duplikatów.

Użycie Strumieni w PHP

W PHP 7.4 i nowszych wersjach dostępna jest również funkcja array_reduce, która umożliwia używanie programowania funkcyjnego do iterowania przez tablicę i tworzenia nowej tablicy bez duplikatów.

php
$tablica = [1, 2, 2, 3, 4, 4, 5];
$unikalnaTablica = array_reduce($tablica, function ($carry, $element) {
if (!in_array($element, $carry)) {
$carry[] = $element;
}
return $carry;
}, []);

print_r($unikalnaTablica); // Wyjście: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

Metoda ta jest bardziej deklaratywna i może być łatwiejsza do zrozumienia dla osób zaznajomionych z programowaniem funkcyjnym.

Usuwanie Duplikatów w Tablicach Wielowymiarowych

W przypadku tablic wielowymiarowych, usuwanie duplikatów staje się bardziej skomplikowane. Możesz jednak użyć kombinacji różnych funkcji PHP, takich jak array_map i serialize, aby zamienić każdy podtablicę na ciąg znaków, a następnie usunąć duplikaty.

Serializacja i Deserializacja

Idea polega na zamianie każdego elementu (który również jest tablicą lub obiektem) na ciąg znaków, co umożliwia łatwe porównanie. Później można te ciągi znaków deserializować z powrotem do ich oryginalnych form.

php
$tablicaWielowymiarowa = [
['id' => 1, 'nazwa' => 'element1'],
['id' => 2, 'nazwa' => 'element2'],
['id' => 2, 'nazwa' => 'element2'],
['id' => 3, 'nazwa' => 'element3']
];

$serializowanaTablica = array_map('serialize', $tablicaWielowymiarowa);
$unikalnaSerializowanaTablica = array_unique($serializowanaTablica);
$unikalnaTablicaWielowymiarowa = array_map('unserialize', $unikalnaSerializowanaTablica);

print_r($unikalnaTablicaWielowymiarowa);

W tym przypadku najpierw przekształcamy każdy element tablicy na jego reprezentację w formie ciągu znaków za pomocą funkcji serialize. Następnie korzystamy z array_unique do usunięcia duplikatów. Na końcu używamy unserialize, aby przywrócić oryginalną strukturę tablicy.

Użycie funkcji array_udiff

Jeżeli elementy tablicy są obiektami, można użyć funkcji array_udiff z własną funkcją porównującą do usunięcia duplikatów.

php
class Element {
public $id;
public $nazwa;

public function __construct($id, $nazwa) {
$this->id = $id;
$this->nazwa = $nazwa;
}
}

function porownajElementy($a, $b) {
return ($a->id - $b->id);
}

$tablicaObiektow = [
new Element(1, 'element1'),
new Element(2, 'element2'),
new Element(2, 'element2'),
new Element(3, 'element3')
];

$unikalnaTablicaObiektow = array_udiff($tablicaObiektow, array_slice($tablicaObiektow, 1), 'porownajElementy');

print_r($unikalnaTablicaObiektow);

W tym przypadku definiujemy klasę Element z dwoma polami (id i nazwa) oraz funkcję porownajElementy, która opisuje, jak porównać dwa obiekty klasy Element. Następnie używamy funkcji array_udiff do usunięcia duplikatów na podstawie tej funkcji porównującej.

Jak widać, PHP oferuje różnorodne metody i funkcje do usuwania duplikatów z tablic, każda z własnym zestawem zalet i wad. Wybór odpowiedniego podejścia zależy od twojego konkretnego przypadku: rodzaju danych, którymi zarządzasz, wymagań wydajnościowych oraz osobistych preferencji w zakresie stylu kodowania.