2012-05-30 148 views
2

試圖刪除重複的陣列元素而不使用array_unique。我正在嘗試使用array_flip方法,但這似乎不適合我。我至今的代碼是:刪除無Array_Unique的陣列元素

$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 

這只是純粹的教育目的,因爲我試圖找到不同的方法來做到這一點。任何幫助非常感謝。

+0

發生了什麼事「二」和「三」?你想刪除重複的元素,或重複的元素? –

+0

你的'removeDuplicates'需要'return $ arr;'。 –

+0

** php手冊** 「array_flip()以翻轉順序返回一個數組,即來自trans的鍵變成值,而來自trans的值成爲鍵。」 from http://php.net/manual/en/function.array-flip.php – 2012-05-30 19:56:54

回答

3

另一個解決方案是:

$counts = array_count_values($arr); 

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

此外,array_unique確保沒有重複的值,而你想不其中有重複的值的數組。這是完全不同的,我想刪除提及array_unique函數將使問題更容易混淆。

+0

+1'array_count_values'。 –

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

DEMO:http://codepad.viper-7.com/l8JkSh

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; 
} 
+0

+1,很好的解決方案。雖然'$ dupes'並不是真的需要。你可以檢查'$ index === $ key',而'array_search'返回第一個匹配。 http://codepad.org/P7erfwYD –