Usuń duplikat z łańcucha w PHP

Szukam najszybszego sposobu na usunięcie zduplikowanych wartości w łańcuchu oddzielonym przecinkami.

Więc mój sznurek wygląda tak;

$str = 'one,two,one,five,seven,bag,tea';

Mogę to zrobić, eksplodując łańcuch do wartości, a następnie porównać, ale myślę, że będzie to powolne. co z preg_replace () będzie szybciej? Ktoś to zrobił za pomocą tej funkcji?

Author: Adnan, 2010-04-10

2 answers

Najkrótszy kod to:

$str = implode(',',array_unique(explode(',', $str)));
Jeśli jest najszybszy... Nie wiem, Jest to prawdopodobnie szybsze niż zapętlanie.

Odniesienie: implode, array_unique, explode

 112
Author: Felix Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-10 10:41:47

$string = 'one,two,one,five,seven,bag,tea';

Jeśli generujesz łańcuch znaków w dowolnym momencie "up script", powinieneś eliminować duplikaty w miarę ich występowania.

Załóżmy, że używasz konkatenacji, aby wygenerować swój ciąg znaków w stylu:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').some_func($value);
}

...następnie należy wyodrębnić unikalne wartości z $string na podstawie ogranicznika (przecinka), a następnie ponownie implodować ogranicznikiem.


Proponuję zaprojektować bardziej bezpośrednią metodę i zaprzeczyć duplikatom wewnątrz inicjału pętla foreach, tak:

foreach($data as $value){
    $return_value=some_func($value);  // cache the returned value so you don't call the function twice
    $array[$return_value]=$return_value;  // store the return value in a temporary array using the function's return value as both the key and value in the array.
}
$string=implode(',',$array);  // clean: no duplicates, no trailing commas

To działa, ponieważ zduplikowane wartości nigdy nie mogą istnieć. Wszystkie kolejne wystąpienia zostaną użyte do nadpisania wcześniejszego wystąpienia. Ten filtr bez funkcji działa, ponieważ tablice mogą nie mieć dwóch identycznych kluczy w tej samej tablicy (poziom).

Alternatywnie można uniknąć "nadpisywania" danych tablicy w pętli, przez wywołanie if(!isset($array[$return_value])){$array[$return_value]=$return_value;}, ale różnica polega na wywołaniu funkcji isset() przy każdej iteracji. Zaletą korzystania z tych asocjacyjne przypisanie kluczy polega na tym, że proces unika użycia in_array(), który jest wolniejszy niż isset().

To wszystko, jeśli wydobywasz kolumnę danych z 2-wymiarowej tablicy, takiej jak:

$string='';
foreach($data as $value){
    $string.=(strlen($string)?',':'').$value['word'];
}

Wtedy możesz wykorzystać magię array_column() bez pętli jak ta :

echo implode(',',array_column($str,'word','word'));

I na koniec, dla zainteresowanych mikro-optymalizacji, zwrócę uwagę, że pojedyncze wywołanie array_unique() jest w rzeczywistości wolniejsze niż kilka metod dwufunkcyjnych. czytaj tutaj po więcej szczegółów.

Dno jest, istnieje wiele sposobów, aby wykonać to zadanie. explode->unique->implode może być najbardziej zwięzłą metodą w niektórych przypadkach, jeśli nie generujesz rozdzielonego ciągu znaków, ale prawdopodobnie nie będzie to metoda najbardziej bezpośrednia lub najszybsza. Wybierz dla siebie to, co jest najlepsze dla Twojego zadania.

 0
Author: mickmackusa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 02:46:34