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?
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
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.
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