publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
skomentuj »

TAGI: tips & tricks , php

2011-06-06 09:13  |  Michał Beyer

Jak z tablicy usunąć lub wyodrębnić zduplikowane wartości w PHP?

Jak z tablicy usunąć lub wyodrębnić zduplikowane wartości w PHP?

Tworząc skomplikowane zapytania do bazy danych lub operując na zbiorach różnorodnych informacji, często zachodzi potrzeba wyodrębnienia lub usunięcia z nich powtarzających się wartości. W jaki sposób można tego dokonać, pokażemy w tej poradzie.

Usunięcie zduplikowanych danych z zachowaniem indeksów

Od czwartej wersji PHP rezultat ten jest prosty do uzyskania, dzięki zastosowaniu funkcji array_unique.

array array_unique(array $tablica [, int $flaga_sortowania = SORT_STRING ]);

Wystarczy podać w pierwszym parametrze tablicę, na której chcemy operować.

 $array = array(

'webhosting.pl',
'blog'                       => 'm1chu.eu',
'portal'                => 'webhosting.pl',
'windowshosting.pl'
);

$result = array_unique($array);
var_dump($result);

W wyniku otrzymamy tablicę wejściową, ale bez wiersza zaindeksowanego jako portal. Zachowywana jest więc zawsze pierwsza występująca wartość, a wszelkie kolejne, takie same, są usuwane. Pozostałe indeksy nie zmieniają się.

array(3) {

[0]=>

string(13) "webhosting.pl"

["blog"]=>

string(8) "m1chu.eu"

[1]=>

string(17) "windowshosting.pl"

}

Problem pojawia się jednak, gdy chcielibyśmy przeprowadzić powyższą operację na tablicy dwuwymiarowej.

$array = array(
array(
'webhosting.pl',
'm1chu.eu'
),
array(
'webhosting.pl',
'm1chu.eu'
),
array(
'portal'          => 'webhosting.pl' 
),
array(
'portal'          => 'webhosting.pl',
'windowshosting.pl'
)
);

$result = array_unique($array);
var_dump($result);

Od wersji 5.2.9 funkcja ta pozwala na sprawdzanie tablic wielowymiarowych, ale robi to w nieco inny sposób, niż ten, który zaprezentowaliśmy powyżej. Sprawdza ona elementy kolejnych wymiarów macierzy pod względem tego, czy nie pokrywają się one wszystkie z wartościami innego klucza pierwszego wymiaru.

Co za tym idzie, ponieważ w $array[0][0,...,n] znajdują się dokładne te same wartości co w $array[1][0,...,n], to ta druga część tablicy zostanie uznana za duplikat. Patrząc jednak na $array[2][0,...,n] i $array[3][0,...,n] tak się już nie stanie, gdyż jedna część drugiego wymiaru składa się z jednego indeksu, a druga z dwóch, o odmiennych wartościach.

array(3) {
 [0]=>
 array(2) {
    [0]=>
   string(13) "webhosting.pl"
    [1]=>
    string(8) "m1chu.eu"
  }
  [2]=>
  array(1) {
   ["portal"]=>
    string(13) "webhosting.pl"
  }
  [3]=>
  array(2) {
    ["portal"]=>
    string(13) "webhosting.pl"
   [0]=>
    string(17) "windowshosting.pl"
  } }

Usunięcie zduplikowanych wartości z przeindeksowaniem

Aby wykonać przeindeksowanie, wystarczy tablicę wyjściową przepuścić przez funkcję array_values.

array array_values(array $tablica);

Zwraca ona wartości funkcji, którą zadamy w parametrze z inkrementowanymi od zera kluczami.

var_dump(array_values($result));

Domyślnie, w każdym wypadku, działa ona na pierwszej płaszczyźnie, bez względu na to ilu wymiarowa jest tablica. Jeżeli chcemy przesortować kolejne, możemy skorzystać z jakiejkolwiek pętli języka PHP.

array(3) {
  [0]=>
  string(13) "webhosting.pl"
  [1]=>
  string(8) "m1chu.eu"
  [2]=>
  string(17) "windowshosting.pl"
}

Wyodrębnienie tylko powtarzających się danych

Aby otrzymać wynik odwrotny od powyższych, można skorzystać z array_diff_key.

array array_diff_key(array $tablica_1, array $tablica_2 [, array $tablica_n ]);

Funkcja ta porównuje ze sobą tablice, zwracając różnice pomiędzy nimi.

$array = array(
'webhosting.pl',
'blog'                       => 'm1chu.eu',
'portal'                => 'webhosting.pl',
'windowshosting.pl'
);

$result = array_diff_key($array, array_unique($array));
var_dump($result);

Wprowadzając więc w jednym parametrze tablice ze wszystkimi elementami, a w drugim bez zduplikowanych wartości, otrzymamy w rezultacie zamierzony cel.

array(1) {
  ["portal"]=>
string(13) "webhosting.pl"
}

W przypadku macierzy wielowymiarowych i metody opartej na pierwszym paragrafie obowiązuje nadal zasada w nim wymieniona.


Uwagi końcowe

  1. Jeżeli za duplikaty chcemy traktować także wartości objęte białymi znakami na początku lub końcu ciągu, to możemy użyć następującej funkcji przed array_unique:

    $tablica_wyjsciowa = array_map('trim', $tablica_wejsciowa);
  2. Funkcja array_unique zwraca wynik względem wielkości znaków. Tak więc słowo Webhosting nie będzie duplikatem webhosting.
publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
skomentuj »

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł