从不区分大小写的数组中删除重复值的最佳解决方案

时间:2011-06-05 01:53:32

标签: php arrays function array-unique

我找到了一些解决方案,但我无法决定使用哪种解决方案。在不区分大小写的数组上使用php的array_unique()函数最简洁有效的解决方案是什么?

示例:

$input = array('green', 'Green', 'blue', 'yellow', 'blue');
$result = array_unique($input);
print_r($result);

结果:

Array ( [0] => green [1] => Green [2] => blue [3] => yellow )

我们如何删除重复的green?至于要删除哪一个,我们假设具有大写字符的重复是正确的。

e.g。保持PHP删除php

或保留PHP删除Php,因为PHP包含更多大写字符。

所以结果将是

Array ( [0] => Green [1] => blue [2] => yellow )

请注意,已保留带大写的绿色。

5 个答案:

答案 0 :(得分:12)

这会有用吗?

$r = array_intersect_key($input, array_unique(array_map('strtolower', $input)));

不关心要保留的具体案例,但是也可以尝试在交叉之前调用asort($input);来保持大写的值(demo at IDEOne.com)。

答案 1 :(得分:3)

如果您可以使用PHP 5.3.0,这是一个可以满足您需求的功能:

<?php
function array_unique_case($array) {
    sort($array);
    $tmp = array();
    $callback = function ($a) use (&$tmp) {
        if (in_array(strtolower($a), $tmp))
            return false;
        $tmp[] = strtolower($a);
        return true;
    };
    return array_filter($array, $callback);
}

$input = array(
    'green', 'Green', 
    'php', 'Php', 'PHP', 
    'blue', 'yellow', 'blue'
);
print_r(array_unique_case($input));
?>

输出:

Array
(
    [0] => Green
    [1] => PHP
    [3] => blue
    [7] => yellow
)

答案 2 :(得分:1)

function count_uc($str) {
  preg_match_all('/[A-Z]/', $str, $matches);
  return count($matches[0]);
}

$input = array(
    'green', 'Green', 'yelLOW', 
    'php', 'Php', 'PHP', 'gREEN', 
    'blue', 'yellow', 'bLue', 'GREen'
);

$input=array_unique($input);
$keys=array_flip($input);
array_multisort(array_map("strtolower",$input),array_map("count_uc",$input),$keys);
$keys=array_flip(array_change_key_case($keys));
$output=array_intersect_key($input,$keys);
print_r( $output );

将返回:

Array
(
    [2] => yelLOW
    [5] => PHP
    [6] => gREEN
    [9] => bLue
)

答案 3 :(得分:0)

首先应将所有值设为小写,然后启动array_unique并完成

答案 4 :(得分:0)

首先通过strtoupper()strtolower()发送数据来规范化您的数据,以使案例保持一致。然后使用你的array_unique()。

$normalized = array_map($input, 'strtolower');
$result = array_unique($normalized);
$result = array_map($result, 'ucwords');
print_r($result);