Возможно, вы сможете сделать это с помощью xpath. что-то вроде //tr[contains(@class, 'row') and position() mod 2 = 0]
может работать. Существуют другие вопросы SO, расширяющие подробности о том, как более точно сопоставлять классы.
Самый короткий код был бы:
$str = implode(',',array_unique(explode(',', $str)));
Если это самый быстрый ... Я не знаю, это, вероятно, быстрее, чем зацикливание явно.
Ссылка: implode
, array_unique
, explode
Работа с: $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
может быть наиболее кратким методом в некоторых случаях, если вы не генерируете строку с разделителями, но вряд ли это будет самый прямой или самый быстрый метод. Выберите для себя, что лучше для вашей задачи.