2

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

问题在于它返回唯一数组,因此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 的答案作为代码库,我可以让它工作起来非常容易、可维护且易于使用……通过将过滤用作静态类方法,我只需调用即可从数组中获取重复值ClassName::get_duplicates($array_to_filter)

private static $counts = null;

private static function filter_duplicates ($value) {
    return self::$counts[ $value ] > 1;
}

public static function get_duplicates ($array) {
    self::$counts = array_count_values( $array );
    return array_filter( $array, 'ClassName::filter_duplicates' );
}
4

6 回答 6

7

利用闭包获得更直接的解决方案:

$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

于 2013-11-14T00:58:56.417 回答
4

您的实现存在一些问题。

1) 如果有 2 个值 1000 和 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

于 2013-11-13T23:32:32.337 回答
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]获取具有另一个重复值的元素数组,等等...false如果在参数中没有找到重复值,则函数返回 -大批。

于 2013-11-13T23:27:31.687 回答
1

如果要获取数组中的重复项,请尝试以下操作:

array_unique(array_diff_assoc($array1, array_unique($array1)))

我从以下位置找到了这个:

http://www.php.net/manual/en/function.array-unique.php#95203

于 2013-11-13T23:28:41.500 回答
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);
于 2013-11-13T23:43:25.660 回答
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);
于 2019-09-04T09:51:47.823 回答