当值未知时,是否有更简单的方法可以获得具有相同值的所有数组键。
带有array_unique
的问题是它返回唯一数组,因此找不到唯一值。
即,例如,从这个数组:
Array (
[a]=>1000
[b]=>1
[c]=>1000
)
我想得到这个
Array (
[a]=>1000
[c]=>1000
)
另一种方法是,如果我能找到孤独的值,然后找到他们的密钥,然后使用array_diff
这是我到目前为止所看到的,看起来很糟糕:
$a = array( 'a' => 1000, 'b' => 1, 'c' => 1000 );
$b = array_flip( array_count_values( $a ) );
krsort( $b );
$final = array_keys( $a, array_shift( $b ) );
更新
使用Paulo Freites的答案作为代码库,我可以通过使用过滤作为静态类方法使其在工作中非常容易,易于维护和轻松...我可以通过调用{{{}来获取数组中的重复值1}}
ClassName::get_duplicates($array_to_filter)
答案 0 :(得分:5)
利用闭包获得更直接的解决方案:
$array = array('a' => 1000, 'b' => 1, 'c' => 1000);
$counts = array_count_values($array);
$filtered = array_filter($array, function ($value) use ($counts) {
return $counts[$value] > 1;
});
var_dump($filtered);
这给了我以下内容:
array(2) {
["a"]=>
int(1000)
["c"]=>
int(1000)
}
这就是全部! :)
更新:向后兼容的解决方案
$array = array('a' => 1000, 'b' => 1, 'c' => 1000);
$counts = array_count_values($array);
$filtered = array_filter($array, create_function('$value',
'global $counts; return $counts[$value] > 1;'));
var_dump($filtered);
答案 1 :(得分:3)
您的实施有一些问题。
1)如果有值1000的2和另一个值的2,则array_flip将丢失其中一组值。
2)如果有两个以上不同的值,array_keys只会找到最多出现的一个值。
3)如果没有重复项,您仍然会带回其中一个值。
像这样的东西总能工作,并会返回所有重复的值:
<?php
//the array
$a = array( 'a' => 1000, 'b' => 1, 'c' => 1000 );
//count of values
$cnt = array_count_values($a);
//a new array
$newArray = array();
//loop over existing array
foreach($a as $k=>$v){
//if the count for this value is more than 1 (meaning value has a duplicate)
if($cnt[$v] > 1){
//add to the new array
$newArray[$k] = $v;
}
}
print_r($newArray);
答案 2 :(得分:1)
目前我无法找到另一种解决方案......
// target array
$your_array = array('a'=>1000, 'b'=>1, 'c'=>1000);
// function to do all the job
function get_duplicate_elements($array) {
$res = array();
$counts = array_count_values($array);
foreach ($counts as $id=>$count) {
if ($count > 1) {
$r = array();
$keys = array_keys($array, $id);
foreach ($keys as $k) $r[$k] = $id;
$res[] = $r;
}
}
return sizeof($res) > 0 ? $res : false;
}
// test it
print_r(get_duplicate_elements($your_array));
<强>输出:强>
Array
(
[0] => Array
(
[a] => 1000
[c] => 1000
)
)
示例#2: - 当您有不同的值乘以
// target array
$your_array = array('a'=>1000, 'b'=>1, 'c'=>1000, 'd'=>500, 'e'=>1);
// output
print_r(get_duplicate_elements($your_array));
<强>输出:强>
Array
(
[0] => Array
(
[a] => 1000
[c] => 1000
)
[1] => Array
(
[b] => 1
[e] => 1
)
)
如果已将函数结果分配给$res
变量$res[0]
,则会从原始数组中获取所有元素的数组,其中第一个值被多次找到,$res[1]
获取另一个重复的元素数组-value等...如果在arguments-array中找不到任何重复,则函数返回false
。
答案 3 :(得分:1)
如果您想获取数组中的重复项,请尝试以下方法:
array_unique(array_diff_assoc($array1, array_unique($array1)))
我发现了这个:
http://www.php.net/manual/en/function.array-unique.php#95203
答案 4 :(得分:1)
试试这个
$a = array( 'a' => 1, 'b' => 1000, 'c' => 1000,'d'=>'duplicate','e'=>'duplicate','f'=>'ok','g'=>'ok' );
$b = array_map("unserialize", array_unique(array_map("serialize", $a)));
$c = array_diff_key($a, $b);
答案 5 :(得分:0)
$array = array("1"=>"A","2"=>"A","3"=>"A","4"=>"B","5"=>"B","6"=>"B");
$val = array_unique(array_values($array));
foreach ($val As $v){
$dat[$v] = array_keys($array,$v);
}
print_r($dat);