удалить дубликат из строки в PHP - PullRequest
29 голосов
/ 10 апреля 2010

Я ищу самый быстрый способ удалить повторяющиеся значения в строке, разделенной запятыми.

Так что моя строка выглядит так;

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

Я могу сделать это, взорвав строку в значения и затем сравнить, но я думаю, что это будет медленно как насчет preg_replace () это будет быстрее? Кто-нибудь делал это с помощью этой функции?

Ответы [ 2 ]

119 голосов
/ 10 апреля 2010

Самый короткий код будет:

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

Если это самый быстрый ... Я не знаю, вероятно, он быстрее, чем зацикливание явно.

Ссылка: implode, array_unique, explode

0 голосов
/ 01 февраля 2018

Работа с: $string = 'one,two,one,five,seven,bag,tea';

Если вы генерируете строку в любой точке «сценария вверх», то вам следует удалять дубликаты по мере их появления.

Допустим, вы используетеконкатенация для генерации вашей строки, например:

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

... тогда вам нужно будет извлечь уникальные значения из $string на основе разделителя (запятая), а затем повторно взорвать с разделителем.


Я предлагаю вам разработать более прямой метод и запретить дубликаты внутри начального цикла foreach, например:

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

Это работает, потому что никогда не допускается существование дублированных значений.Все последующие вхождения будут использоваться для перезаписи предыдущего вхождения.Этот бесполезный фильтр работает, потому что массивы могут не иметь двух одинаковых ключей в одном и том же массиве (уровне).

В качестве альтернативы, вы можете избежать "перезаписи" данных массива в цикле, вызвав if(!isset($array[$return_value])){$array[$return_value]=$return_value;} но разницуозначает вызов функции isset() на каждой итерации.Преимущество использования этих ассоциативных назначений клавиш состоит в том, что процесс избегает использования in_array(), который медленнее, чем isset().

Все это говорит, если вы извлекаете столбец данных из 2-мерного массива, такого как:

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

Тогда вы можете использовать магию array_column() без петли вот так :

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

И, наконец, для тех, кто заинтересованВ микрооптимизации отмечу, что один вызов array_unique() на самом деле медленнее, чем несколько двухфункциональных методов. Подробнее читайте здесь .

Суть в том, что есть много способов выполнить эту задачу.explode->unique->implode может быть самым кратким методом в некоторых случаях, если вы не генерируете строку с разделителями, но вряд ли это будет самый прямой или самый быстрый метод.Выберите для себя, что лучше для вашей задачи.

...