2

array_uniqueを使用せずに重複する配列要素を削除しようとしています。array_flipメソッドを使用しようとしていますが、うまくいかないようです。私がこれまでに持っているコードは次のとおりです。

$arr = array(
   'a' => "one",
   'b' => "two",
   'c' => "three",
   'd' => "two",
   'e' => "four",
   'f' => "five",
   'g' => "three",
   'h' => "two"
);

function removeDuplicates($arr) {


$arr = array_flip($arr);
$arr = array_flip($arr);

}
print_r(removeDuplicates($arr));

私が最終的に取得しようとしている出力は次のとおりです。

  [a] => one
    [e] => four
    [f] => five

私はそれを行うためのさまざまな方法を見つけようとしているので、これは純粋に教育目的のためです。どんな助けでも大歓迎です。

4

3 に答える 3

3

別の解決策は次のとおりです。

$counts = array_count_values($arr);

foreach ($arr as $key => $value) {
        if ($counts[$value] > 1) {
                unset($arr[$key]);
        }
}

また、array_uniqueは重複する値がないことを確認しますが、重複する値のない配列が必要です。これはまったく異なります。array_unique関数の言及を削除すると、質問の混乱が少なくなると思います。

于 2012-05-30T20:17:35.497 に答える
2

array_flipは重複がないことを確認しますが、一意の値は提供しません。

あなたが探している出力

[a] => one
[e] => four
[f] => five

一意の値です。おそらく取得している配列は

[a] => one
[b] => two
[c] => three
[e] => four
[f] => five

あなたの出力のためにあなたは次のようなことをする必要があるでしょう

function array_real_unique($arr, $strict = FALSE) {
    $unique = array();
    $dupes = array();
    foreach ($arr as $key => $value) {
        if (($index = array_search($value, $dupes, $strict)) === FALSE)
            $unique[$key] = $value;
        else
            unset($unique[$index]);
        $dupes[$key] = $value;
    }

    return $unique;
}
于 2012-05-30T20:23:27.710 に答える
1

コードに追加した場合はreturn $arr;、と同じように機能しarray_uniqueます。よくほとんど。 array_unique要素の最初のインスタンスを保持し、最後のインスタンスを保持します。

あなたの例は、重複する要素ではなく重複する要素を削除したいことを示しています。そのためには、重複するエントリのリストを取得してから、それらの値を削除する必要があります。

更新: チェックアウトしてくださいarray_filter、これはあなたの状況でうまくいくはずです。

// This only works in PHP 5.3+
$arr = array_filter($arr, function($a) use($arr){
    // remove the element if it exists more than once
    return count(array_keys($arr, $a)) === 1; // Get the keys for a value
});

デモ:http ://codepad.viper-7.com/l8JkSh

于 2012-05-30T20:13:02.243 に答える