2010-04-10 3 views
27

문자열에서 쉼표로 구분 된 중복 값을 제거하는 가장 빠른 방법을 찾고 있습니다.PHP에서 문자열에서 중복을 제거하십시오

내 문자열이 이렇게 보입니다.

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

문자열을 값으로 분해 한 다음 비교할 수는 있지만 느릴 것입니다. preg_replace()는 더 빠를 것인가? 어떤 사람이이 기능을 사용 했습니까?

+0

이 데이터의 예상 크기는 얼마입니까? –

답변

102

가장 짧은 코드는 다음과 같습니다

가 빠른 경우
$str = implode(',',array_unique(explode(',', $str))); 

... 나도 몰라, 아마 빨리 명시 적으로 반복 한 후입니다.

참조 : 다루기 implode, array_unique, explode

+0

@Felix, 고맙습니다. 그게 내가 필요로하는 것입니다. 문자열의 최대 값은 50입니다. – Adnan

+0

@Adnan : 50 개의 값을 사용하면 문제가 많지 않을 것입니다. –

+0

2의 배수 일 경우 작동합니다. 아닙니다, 실패합니다. –

0

는 : $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 

. 모든 후속 어커런스는 이전 어커런스를 덮어 쓰는 데 사용됩니다. 이 function-less 필터는 배열이 동일한 배열 (레벨)에 두 개의 동일한 키를 가질 수 없기 때문에 작동합니다.

if(!isset($array[$return_value])){$array[$return_value]=$return_value;}을 호출하여 루프의 배열 데이터를 "덮어 쓰지"않아도되지만 차이점은 모든 반복에서 isset() 함수를 호출하는 것을 의미합니다. 이러한 연관 키 할당을 사용할 때의 이점은 isset()보다 느린 in_array()을 사용하지 않아도된다는 것입니다.

가 같은 2 차원 어레이의 데이터 열을 추출하는 경우, 상기 그 전체 :

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

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

는 그런 다음 루프 like this없이 array_column() 마법을 활용할 수도


마지막으로 마이크로 최적화에 관심이있는 사용자는 array_unique()의 단일 호출이 실제로 af보다 느리다는 것을 알 수 있습니다. 두 가지 함수 방법. 자세한 내용은 Read here을 참조하십시오.

마지막으로,이 작업을 수행하는 방법은 여러 가지가 있습니다.explode->unique->implode은 구분 된 문자열을 생성하지 않는 경우 가장 간결한 방법 일 수 있지만 가장 직접적이거나 가장 빠른 방법은 아닙니다. 자신의 업무에 가장 적합한 것을 선택하십시오.

관련 문제