удалить дубликаты из строки, разделенной запятыми

Есть ли лучшее (более быстрое) решение для удаления дубликатов из строки, разделенной запятой?

public function d($dep) { if (strpos($dep,',') !== false) { $nd = explode(',',$dep); $oa = array_unique($nd); $nx = (count($oa) > 1) ? implode(",",$oa) : $oa[0]; } else { $nx = $dep; } return $nx; } 

Спасибо, парни.

Вы можете использовать уникальность ключей массива:

 function d($dep) { return implode(',', array_keys(array_flip(explode(',', $dep)))); } 

array_flip заменяет связь ключа и значения, поэтому значения становятся ключами и наоборот. Это автоматически устранит дубликаты. Его сложностью выполнения является O ( n ).

Попробуйте это:

 $uniqueDep = implode(',', array_unique(explode(',', $dep))); 

Я бы, вероятно, использовал ту же идею, что и вы опубликовали; но я думаю, что вы можете удалить свои два условия, чтобы использовать только это:

 $exploded = explode(',', $str); $unique = array_unique($exploded); $imploded = implode(',', $unique); var_dump($imploded); 

Я тестировал его с этими тремя строками, и, похоже, он работает в каждом случае:

 $str = 'a,b,c,d,a,c,e,f'; $str = 'a,a'; $str = 'a'; 

Заметки :

  • Использование explode в строке, которая не содержит разделителя, вернет массив с одним элементом – ваш тест с strpos не нужен.
  • И использование implode в массиве только с одним элементом будет работать (не добавляя никакого разделителя) – ваш тест с тернарным оператором также не нужен.

Конечно, вы также можете удалить переменные и использовать только одну строку:

 $result = implode(',', array_unique(explode(',', $str))); 

Не уверен, что это легче понять, хотя …

Много благодарностей. Наконец, у нас есть два решения (Паскаль и Эриксо дали такое же решение), и вопрос стал тем, который быстрее. Честно говоря, быстрее, я имел в виду, что выполняется быстрее, и если я беру слова Gumbo, я получаю комбинированные функции array_keys а array_flip быстрее, чем array_unique . Потому что две другие функции, explode и explode , одинаковы.

 return implode(',', array_unique(explode(',', $dep))); return implode(',', array_keys(array_flip(explode(',', $dep)))); 

Наконец, я дал 1 благодарность всем трем рекламным словам, которые невозможно измерить / увидеть. Я согласен с тем, что любое из трех решений можно ожидать, но затем взял ответ Gumbo, полагая, что array_keys(array_flip()) выполняется быстрее, чем array_unique() в данном контексте.

Приветствия.

 $str = implode(',',array_unique(explode(',', $str)));