удалить дубликат из строки в PHP

Возможно, вы сможете сделать это с помощью xpath. что-то вроде //tr[contains(@class, 'row') and position() mod 2 = 0] может работать. Существуют другие вопросы SO, расширяющие подробности о том, как более точно сопоставлять классы.

29
задан Adnan 10 April 2010 в 10:39
поделиться

2 ответа

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

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

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

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

119
ответ дан Felix Kling 10 April 2010 в 10:39
поделиться

Работа с: $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().

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

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

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

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

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

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

0
ответ дан mickmackusa 10 April 2010 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: