我想从一个数组中检索出所有不区分大小写的重复项。在PHP中是否有可能实现?
array(
1 => '1233',
2 => '12334',
3 => 'Hello',
4 => 'hello',
5 => 'U'
);
期望的输出数组:
array(
1 => 'Hello',
2 => 'hello'
);
我想从一个数组中检索出所有不区分大小写的重复项。在PHP中是否有可能实现?
array(
1 => '1233',
2 => '12334',
3 => 'Hello',
4 => 'hello',
5 => 'U'
);
期望的输出数组:
array(
1 => 'Hello',
2 => 'hello'
);
function get_duplicates ($array) {
return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}
array_unique
,原始数组中有一个值出现了三次,返回的数组将会出现两次;或者如果原始数组中有四个相同的值,返回的数组中将只有三个。 - 75th Trombone<?php
function array_not_unique($raw_array) {
$dupes = array();
natcasesort($raw_array);
reset($raw_array);
$old_key = NULL;
$old_value = NULL;
foreach ($raw_array as $key => $value) {
if ($value === NULL) { continue; }
if (strcasecmp($old_value, $value) === 0) {
$dupes[$old_key] = $old_value;
$dupes[$key] = $value;
}
$old_value = $value;
$old_key = $key;
}
return $dupes;
}
$raw_array = array();
$raw_array[1] = 'abc@xyz.com';
$raw_array[2] = 'def@xyz.com';
$raw_array[3] = 'ghi@xyz.com';
$raw_array[4] = 'abc@xyz.com'; // Duplicate
$common_stuff = array_not_unique($raw_array);
var_dump($common_stuff);
array_map("serialize", $arr);
,那么对于二维数组也是一个不错的解决方案。谢谢! - Boolean_Type为了得到你想要的 "Hello" => "hello" 的结果,你需要将函数不区分大小写。可以尝试使用以下方法:
$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'hello', 5=>'U');
// Convert every value to uppercase, and remove duplicate values
$withoutDuplicates = array_unique(array_map("strtoupper", $arr));
// The difference in the original array, and the $withoutDuplicates array
// will be the duplicate values
$duplicates = array_diff($arr, $withoutDuplicates);
print_r($duplicates);
输出结果为:
Array
(
[3] => Hello
[4] => hello
)
编辑者 @AlixAxel:
这个答案非常误导人,它只在特定情况下有效。以下是一个反例:
$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'HELLO', 5=>'U');
失败了。而且,这不是保留重复项的方法:
array_diff($arr, array_unique($arr));
由于重复的值之一将在 array_unique
中,并且随后被 array_diff
剪掉。
@RyanDay编辑:
因此,请查看 @Srikanth 或 @Bucabay 的答案,它们适用于所有情况(在 Bucabay 的答案中寻找不区分大小写),而不仅仅是问题中指定的测试数据。
array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));
以下是不区分大小写的解决方案:
$iArr = array_map('strtolower', $arr);
$iArr = array_intersect($iArr, array_unique(array_diff_key($iArr, array_unique($iArr))));
array_intersect_key($arr, $iArr);
但是@Srikanth的答案更高效(实际上,除了这个答案以外,它是唯一一个正确工作的)。
function array_not_unique($raw_array) {
$dupes = array();
natcasesort($raw_array);
reset($raw_array);
$old_key = NULL;
$old_value = NULL;
foreach ($raw_array as $key => $value) {
if ($value === NULL) { continue; }
if (strcasecmp($old_value, $value) === 0) {
$dupes[$old_key] = $old_value;
$dupes[$key] = $value;
}
$old_value = $value;
$old_key = $key;
} return $dupes;
}
Srikanth(约翰)添加了大小写不敏感的比较方式。
尝试:
$arr2 = array_diff_key($arr, array_unique($arr));
array_diff_key($arr, array_unique(array_map('strtolower', $arr)));
这是一篇12年前的帖子,被采纳的答案返回一个空数组,其他答案则过于冗长。
以下是我对未来的谷歌搜索者的建议,它简短明了,并且返回所有重复的索引(Indices?)。
$myArray = array('fantastic', 'brilliant', 'happy', 'fantastic', 'Happy', 'wow', 'battlefield2042 :(');
function findAllDuplicates(array $array)
{
// Remove this line if you do not need case sensitive.
$array = array_map('strtolower', $array);
// Remove ALL duplicates
$removedDuplicates = array_diff($array, array_diff_assoc($array, array_unique($array)));
return array_keys(array_diff($array, $removedDuplicates));
// Output all keys with duplicates
// array(4) {
// [0]=>int(0)
// [1]=>int(2)
// [2]=>int(3)
// [3]=>int(4)
// }
return array_diff($array, $removedDuplicates);
// Output all duplicates
// array(4) {
// [0]=>string(9) "fantastic"
// [2]=>string(5) "happy"
// [3]=>string(9) "fantastic"
// [4]=>string(5) "happy"
// }
}