查找具有相同值的所有数组键

时间:2013-11-13 23:20:11

标签: php arrays duplicates

当值未知时,是否有更简单的方法可以获得具有相同值的所有数组键。

带有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)

6 个答案:

答案 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)
}

演示:https://eval.in/67526

这就是全部! :)

更新:向后兼容的解决方案

$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);

演示:https://eval.in/68255

答案 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);

http://codepad.viper-7.com/fal5Yz

答案 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);