⚡ РАБОЧЕЕ РЕШЕНИЕ ⚡
Если вы заботитесь о производительности и микрооптимизации, проверьте эту строку:
function no_dupes(array $input_array) {
return count($input_array) === count(array_flip($input_array));
}
Описание:
Функция сравнивает количество элементов массива в $input_array
с array_flip 'ed элементами. Значения становятся ключами и предполагают, что - ключи должны быть уникальными в ассоциативных массивах, чтобы не потерялись уникальные значения и конечное число элементов было меньше исходного.
Как сказано в руководстве ключи массива могут быть только типом int
или string
, так что это то, что вы можете иметь в исходных значениях массива для сравнения, иначе PHP запустит casting с неожиданными результатами.
ДОКАЗАТЕЛЬСТВО ДЛЯ 10-МЕТРОВОЙ ЗАПИСИ
- Решение с наибольшим количеством голосов: 14.187316179276s ??????????????
- Принято решение: 2,0736091136932s ??
- Этот ответ решение: 0,14155888557434s ? / 10
Контрольный пример:
<?php
$elements = array_merge(range(1,10000000),[1]);
$time = microtime(true);
accepted_solution($elements);
echo 'Accepted solution: ', (microtime(true) - $time), 's', PHP_EOL;
$time = microtime(true);
most_voted_solution($elements);
echo 'Most voted solution: ', (microtime(true) - $time), 's', PHP_EOL;
$time = microtime(true);
this_answer_solution($elements);
echo 'This answer solution: ', (microtime(true) - $time), 's', PHP_EOL;
function accepted_solution($array){
$dupe_array = array();
foreach($array as $val){
// sorry, but I had to add below line to remove millions of notices
if(!isset($dupe_array[$val])){$dupe_array[$val]=0;}
if(++$dupe_array[$val] > 1){
return true;
}
}
return false;
}
function most_voted_solution($array) {
return count($array) !== count(array_unique($array));
}
function this_answer_solution(array $input_array) {
return count($input_array) === count(array_flip($input_array));
}
Обратите внимание, что принятое решение может быть быстрее в определенных условиях, когда неуникальные значения находятся рядом с началом огромного массива.