2010-02-16 148 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的更好,但。