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 に答える
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 に答える
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 に答える