Есть ли лучшее (более быстрое) решение для удаления дубликатов из строки, разделенной запятой?
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)));