2010-02-16 5 views
27

대/소문자를 구분하지 않는 배열의 고유 한 형식 함수를 만들기 위해 몇 줄의 코드를 작성하려고합니다. 여기에 내가 지금까지 가지고있는 것 :case-insensitive array_unique

foreach ($topics as $value) { 
    $lvalue = strtolower($value); 
    $uvalue = strtolower($value); 

    if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { 
     array_push($utopics, $value); 
    } 
} 

문제는 if 문입니다. 제 문법에 문제가 있다고 생각합니다. 그러나 저는 PHP에 비교적 익숙하지 않아 무엇인지 모르겠습니다. 어떤 도움이 필요합니까?

답변

46
function array_iunique($array) { 
    return array_intersect_key(
     $array, 
     array_unique(array_map("StrToLower",$array)) 
    ); 
} 
+1

굉장! 감사! – williamg

+11

@ Pentium10 : 해결책의 출처를 밝혀야합니다. http://www.php.net/manual/de/function.array-unique.php#78801 – sieppl

+3

위대한 발견 펜티엄 10, strtolower 따옴표로 있어야합니다. – Orlymee

2

lvalueuvalue을 모두 소문자로 설정하십시오.

$uvalue = strtolower($value); 

이 조금 빠를 수 있습니다 말했다

$uvalue = strtoupper($value); 

해야한다. 이 더 많거나 적은 선형 반면 함수의 성능은

<?php 

function array_iunique($ar) { 
    $uniq = array(); 
    foreach ($ar as $value) 
    $uniq[strtolower($value)] = $value; 
    return array_values($uniq); 
} 
?> 
+0

와우 .- 가끔은 다른 눈 쌍이 필요할 수도 있습니다. 하하 감사합니다! 그것은 아직도 그것을하지 않습니다. 무엇이 잘못 되었습니까? 나타나는 값은 중복 된 값 (예 : jQuery 및 jQuery)이 모두 표시됩니다. 그러나 다른 값 (예 : PHP 및 PHP)도 표시되지 않습니다. 이상한 ... – williamg

+0

좋은 해결책! 나를 귀찮게하는 것은 오직 원래의'array_unique' 함수가 키를 보존하는 반면, 이것은 그렇지 않지만,이 경우에는 중요하지 않다고 생각합니다. –

+1

@Tatu 데이터를 버릴 때 키를 보존하는 것이 어려울 것입니다 ... 어느 키를 보존합니까? 첫 번째 또는 마지막 또는 임의로 선택한 하나? – meagar

0

는 uvalue 대문자되지 $해야 (추측이 아닌 COMP-공상 과학 전공에서 ...), 기하 급수적으로 저하됩니다? 그래서

$uvalue = strtoupper($value): 
0

다른 대안 ...

function array_iunique($topics) { 

    $ltopics = array_map('strtolower', $topics); 
    $cleanedTopics = array_unique($ltopics); 

    foreach($topics as $key => $value) { 
     if(!isset($cleanedTopics[$key])) { 
      unset($topics[$key]); 
     } 
    } 

    return $topics; 

} 

Pentium10의 그래도 낫다.

관련 문제