4/5 - (1 vote)

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.

Poprzedni artykułJavaScript: Blokada Zaznaczania Tekstu na Stronie
Następny artykuł[PHP] Jak zaokrąglać liczby zmiennoprzecinkowe?
Artykuły Czytelników

Artykuły Czytelników to przestrzeń na porady-it.pl dla osób, które chcą podzielić się własnym doświadczeniem z PHP, webmasteringu i tworzenia praktycznych skryptów. Publikujemy tu sprawdzone rozwiązania, case study, krótkie „tipy” oraz opisy problemów, które udało się rozwiązać w realnych projektach – od formularzy i baz danych, po integracje API i optymalizację działania stron. Każdy materiał jest redagowany tak, by był czytelny, użyteczny i bezpieczny do wdrożenia, a autor otrzymał jasne miejsce na swoją wiedzę i wkład w społeczność. Masz temat? Napisz: administrator@porady-it.pl

1 KOMENTARZ

  1. Bardzo cenna publikacja! Autor w przystępny sposób przedstawił sposób usuwania powtarzających się wartości z tablicy w PHP, co na pewno przyda się wielu programistom. Mimo tego, brakuje mi jednak bardziej zaawansowanych technik czy dodatkowych przykładów zastosowania, które mogłyby poszerzyć wiedzę czytelnika na temat tego zagadnienia. Ogólnie jednak artykuł zasługuje na uwagę i pozytywną ocenę.

Możliwość dodawania komentarzy nie jest dostępna.