Работа с: $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
может быть самым кратким методом в некоторых случаях, если вы не генерируете строку с разделителями, но вряд ли это будет самый прямой или самый быстрый метод.Выберите для себя, что лучше для вашей задачи.