Как найти повторяющиеся элементы в массиве?

Скажем, у меня есть массив из n элементов (числа или слова), я хочу найти все элементы, которые встречаются более одного раза в массиве. Каков наиболее эффективный способ сделать это с точки зрения производительности?

PS: Я могу сначала отсортировать массив, но только если это не влияет на общую производительность. Кроме того, хотя это в основном php, я хотел бы знать алгоритм или логику, которая может быть реализована и на других платформах.

Вы можете использовать array_count_values и 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; } 

вывод

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

Существует функция 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'); 
 $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; } } 

Надеюсь, что это сработает

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