2010-02-16 16 views
27

Próbuję napisać kilka linii kodu, aby utworzyć unikalną wielkość liter unikalną funkcję typu tablicy. Oto, co mam do tej pory:case-niewrażliwe 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); 
    } 
} 

Problemem jest instrukcja if. Myślę, że coś jest nie tak z moją składnią, ale jestem względnie nowy w PHP i nie jestem pewien co to jest. Jakaś pomoc?

Odpowiedz

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

Awesome! Dzięki! – williamg

+11

@ Pentium10: Powinieneś podać źródło swojego rozwiązania: http://www.php.net/manual/de/function.array-unique.php#78801 – sieppl

+3

Świetne znalezisko Pentium10, strtolower powinien być w cudzysłowie. – Orlymee

2

Ustawia się lvalue i uvalue na wersję z małą literą.

$uvalue = strtolower($value); 

powinny być

$uvalue = strtoupper($value); 

Powiedział, że to może być trochę szybciej. Występ swojej funkcji pogorszy wykładniczo, a to będzie bardziej lub mniej liniowa (na oko, nie jest to poważny comp-sci ...)

<?php 

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

Wow -.- Czasami myślę, że potrzebuję jeszcze jednej pary oczu. haha dzięki! Jednak nadal nie całkiem to robi. Nie wiesz, co jest nie tak ... Wyświetlane wartości to wartości będące duplikatami (jak jQuery i jQuery), które są wyświetlane. Ale z wartościami, które są różne (jak php i PHP), żadne z nich się nie wyświetla. Weird ... – williamg

+0

Ładne rozwiązanie! Jedyne, co mi przeszkadza to to, że oryginalna funkcja 'array_unique' zachowuje klucze, podczas gdy tak nie jest, ale myślę, że to nie ma znaczenia w tym przypadku. –

+1

@Tatu byłoby trudno zachować klucze, gdy odrzucasz niektóre dane ... który klucz zachowujesz? Pierwszy, ostatni lub wybrany losowo? – meagar

0

Gdyby $ nie uvalue być duża? Więc

$uvalue = strtoupper($value): 
0

a inna alternatywa ...

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 jest lepsza.