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 回答