2011-07-28 11 views
2

Disons que j'ai un tableau de n éléments (nombres ou mots), je veux trouver tous les éléments qui se produisent plus d'une fois dans le tableau. Quelle est l'approche la plus efficace pour ce faire en termes de performance? PS: Je peux trier le tableau en premier, mais seulement si cela n'affecte pas beaucoup la performance totale. Aussi, bien que ce soit principalement php, je voudrais connaître un algorithme ou une logique qui peut être implémenté sur d'autres plateformes aussi.Comment trouver les éléments répétés dans un tableau?

+0

trie le tableau d'abord une option? – jBit

+0

performances dépend de la longueur de la matrice et aussi probablement sur la fréquence des doublons. –

+0

duplication possible de [occurrences de Couting de chaque valeur dans un tableau] (http://stackoverflow.com/questions/4872835/couting-occurrences-of-each-value-in-an-array) – Gordon

Répondre

4

Vous pouvez utiliser array_count_values et array_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; 
} 

sortie

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

Vous pouvez ajouter 'array_filter', comme:' array_filter (array_count_values ​​($ array), function ($ val) { \t return $ val> 1; }); ' – Yoshi

+0

Pas besoin de créer une fonction pour cela, vous peut simplement utiliser 'create_function()' pour créer un callable qui est automatiquement détruit après utilisation. Le seul besoin de créer une fonction entièrement fonctionnelle est si vous avez besoin d'appeler autant de fois, de différentes parties du code, etc. Les fonctions Python lambda me manquent, en 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

Espérons que cela fonctionne

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

Amour à coder dans Oneline: – Sreeraj

1

Il y a une fonction array_count_values() fournie par PHP lui-même.

Il fait plus que ce que vous avez besoin, mais devrait être assez rapide car il est compilé dans ..

Ensuite, bien sûr, vous avez besoin de filtrer le résultat pour les clés dont la valeur est> 1.

EDIT

Si vous voulez en une ligne:

$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'); 
Questions connexes