不区分大小写的array_unique

时间:2010-02-16 21:07:25

标签: php arrays loops foreach

我正在尝试编写几行代码来制作不区分大小写的数组唯一类型函数。这是我到目前为止所做的:

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比较新,我不确定它是什么。有什么帮助吗?

5 个答案:

答案 0 :(得分:58)

function array_iunique( $array ) {
    return array_intersect_key(
        $array,
        array_unique( array_map( "strtolower", $array ) )
    );
}

答案 1 :(得分:5)

您将lvalueuvalue都设置为小写版本。

 $uvalue = strtolower($value);

应该是

 $uvalue = strtoupper($value);

那就是说,这可能会快一点。你的函数的性能将呈指数级下降,而这将或多或少是线性的(猜测,而不是comp-sci major ...)

<?php

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

答案 2 :(得分:0)

$ uvalue应该不是大写的吗? 所以

$uvalue = strtoupper($value):

答案 3 :(得分: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虽然更好。

答案 4 :(得分:0)

function array_unique_ci ($arr) {
    return array_intersect_key (
        $arr, array_unique (
            array_map ('strtolower', array_map ('trim', $arr))
        )
    );
}

另外,在比较它们之前修剪数值并不会造成伤害。