2010-02-16 147 views
27

我正在嘗試寫幾行代碼來使大小寫不敏感的數組唯一類型函數。這是我到目前爲止:不區分大小寫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 2010-02-16 21:21:09

+11

@ Pentium10:你應該給你的解決辦法的來源:http://www.php.net/manual/de/function.array-unique.php#78801 – sieppl 2012-02-14 14:42:54

+3

偉大的發現Pentium10,strtolower應該在引號。 – Orlymee 2012-04-12 13:51:49

2

您正在將lvalueuvalue設置爲小寫版本。

$uvalue = strtolower($value); 

應該

$uvalue = strtoupper($value); 

那說,這可能會快一點。你的函數的性能將成倍降低,而這將是或多或少的線性(在猜測,而不是COMP-SCI大...)

<?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 2010-02-16 21:14:03

+0

不錯的解決方案!唯一令我困擾的是原始'array_unique'函數保留了鍵,而這不是,但我猜這在這種情況下並不重要。 – 2010-02-16 21:21:27

+1

@Tatu當你丟棄一些數據時,你很難保存密鑰......你保留哪個密鑰?第一個,還是最後一個,或隨機選擇的一個? – meagar 2010-02-16 21:22:36

0

於$ uvalue不大寫? 所以

$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的更好,但。