我找到了一些解决方案,但我无法决定使用哪种解决方案。在不区分大小写的数组上使用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 )
请注意,已保留带大写的绿色。
答案 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);