2011-07-28 55 views
2

假設我有n個元素(數字或單詞)的數組,我想要查找數組中出現多次的所有元素。在性能方面做什麼最有效的方法是什麼?如何在數組中找到重複元素?

PS:我可以先排序數組,但只有在不影響整體性能的情況下。 此外,雖然這主要是PHP,我想知道一個算法或邏輯,也可以在其他平臺上實現。

+0

是第一排數組的選項? – jBit

+0

性能取決於陣列的長度,也可能取決於重複的頻率。 –

+0

[Couting發生數組中每個值的重複]的可能的重複(http://stackoverflow.com/questions/4872835/couting-occurances-of-each-value-in-an-array) – Gordon

回答

4

您可以使用array_count_valuesarray_filter

$array = array(1, "hello", 1, "world", "hello"); 
$new=array_filter(array_count_values($array),'custom_filter'); 
print_r($new); 
function custom_filter($val) 
{ 
    return $val > 1; 
} 

輸出

Array 
(
    [1] => 2 
    [hello] => 2 
) 
+0

您可以添加'array_filter',如:'array_filter(array_count_values($陣列),功能($ VAL){ \t回$值> 1; });' – Yoshi

+0

無需創建一個函數,你可以使用'create_function()'創建一個在使用後被自動銷燬的可調用對象。唯一需要創建一個全功能的函數是,如果你需要從代碼的不同部分調用那麼多次。我錯過了PHP lambda函數,在PHP中) – redShadow

0
$lookup = array(); 
foreach($array as $v) { 
    if (!isset($lookup[$v])) 
     $lookup[$v] = false; 
    else if ($lookup[$v] == false) { 
     echo "Duplicate $v\n"; 
     $lookup[$v] = true; 
    } 
} 
0

希望這將工作

array_unique(array_diff($inputArray, array_unique($inputArray))); 
+0

愛到代碼在Oneline: ) – Sreeraj

1

有提供一個array_count_values()功能PHP本身。

它確實比你需要更多的,但應該是比較快的,因爲它是編譯的..

然後,當然,你需要過濾出來的結果爲功能按鍵值是> 1

編輯

如果你想要一個班輪:

$a = array('a','b','c','a','a','b','d','e'); 
array_keys(array_filter(array_count_values($a), create_function('$x', 'return $x>1;'))); 
// array (0 => 'a', 1 => 'b');