Поиск дубля в массиве на PHP

Оказывается, очень частая задача в тестовых заданиях соискателей — это поиск дубля в массиве. В зависимости от нюансов конкретного задания, могут просить:

  • найти все дубли или один единственный дубль;
  • использовать в решении самый быстрый алгоритм;
  • найти вообще все повторяющиеся варианты.

Я рассмотрю здесь частное решение (целых три варианта), которое вы подкрутите для своего случая. Это поиск единственного дубля в массиве чисел.

Итак, пусть $A — произвольный массив чисел. Напишем функцию, которая ищет близнеца или возвращает FALSE.

Скоростной вариант

Самый первый и самый быстрый вариант поиска — это положиться только на функции PHP без каких либо свои циклов и ветвлений.

Мы посчитали число значений, а потом просто вывернули массив. Если дублей было несколько — останется только один. Если нужно другое число повторений — используйте другой ключ на выходе (не 2, а 3, 4..).

PHP гораздо быстрее работает внутри собственных откомпилированных функций, нежели с вашими алгоритмами, какими бы они не были гениальными.

Вариант с сортировкой

Здесь мы сортируем массив, чтобы потом «вручную» просканировать его и найти рядом стоящих близнецов.

Так мы обнаружим любое повторяющееся произвольное число раз значение (т.е. тройняшек,  и т.д.)

Если по условиям задачи массив уже отсортирован, то sort() можно убрать. Останется сканер массива, быстродействие которого линейно зависит от размеров массива.

В среднем, этот вариант в 2-3 раза медленнее предыдущего (на диапазоне от 1к до 100 к элементов).

Перекладываем из одной корзины в другую

Самый тормозной, неэффективный из трех.

Мы перебираем вх. массив ($A), складывая элементы в другой ($B). Но если в нем ($B) уже есть искомое значение, то вуаля! мы нашли близнеца.

В некоторых случаях, такая конструкция бывает востребована. Например, когда вы должны провести какие вычисления с каждым элементом, а потом уже принимать решение об эквивалентности.

Этот вариант  на 2 порядка хуже первого решения.

Если у вас есть другие варианты — присылайте :).

Мало букафф? Читайте есчо !

Время в PHP, смещение от GMT, UTC

Январь 14, 2016 г.

Для начала разберемся что такое GMT и UTC.  Во многих источниках они упоминаются как синонимы, и между ними действительно не существенная разница (до 1 секунды). Их отличие в методике получения точного значения. UTC (универсальное координированное ...

Читать

PHP код для калькулятора боёв Dragons of Atlantis

Июль 3, 2012 г.

Выкладываю php код, по просьбе Blagtoof. Забавно, что это кому то может быть нужно. :) А мне не жалко. Забросил по понятным причинам саму игру. Скачать как файл (download php code as text file). [crayon-698937cfa0c19492901592/]

Читать

Сохранение файла, загруженного на сервер с помощью PHP

Январь 29, 2021 г.

Эта статья о некоторых задачах, возникающих при сохранении файла на сервере, при получении его от пользователя через форму (<input type="file" />). Определимся с требованиями. Технически, решение нужно в виде функции, которая принимает набор ...

Читать

Если simplexml "не парсит" атрибуты...

Август 12, 2017 г.

.. то скорее всего, вы ошибаетесь. Рассмотрим следующий пример XML. В документе example.xml содержится запись о валюте и информация о категории товара. Обе записи содержат аттрибуты. [crayon-698937cfa1221817511473/] Выполним чтение и вывод информации ...

Читать
 

Комментарии к «Поиск дубля в массиве на PHP»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий:

Много комментариев в “Поиск дубля в массиве на PHP”

  1. Никита:

    Есть куда более простой способом.
    $array = array (1,2,3,3,3,2);
    $array_uniq = array_unique($array);

    print_r(array_diff_key($array, $array_uniq));

    • Спасибо, Никита. Тоже годный пример.
      Хотя первый вариант по-проще будет.
      И тут, видимо, ещё можно добавить как последний штрих — array_unique().

      function array_find_twins_Nikita_remix($A) {
      return array_unique(array_diff_key($A, array_unique($A)));
      }