Вопрос

Это относится к одному из моих предыдущих вопросов: array_unique vs array_flip - В этом говорится, что array_flip(array_flip()) намного быстрее, чем array_unique() При работе с простыми строками и целыми числами.

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

Источник для обеих функций доступен здесь.

Заранее спасибо!

Это было полезно?

Решение

Если вы подумаете об этом алгоритмически, способ удаления дубликатов - это пройти список, отслеживать элементы, которые вы найдете, и избавиться от вещей, которые уже находятся в этом «найденном» списке. Один простой способ сделать это - сортировать список. Таким образом, очевидно, где эффективно удалить дубликаты. Подумайте о вас, не говоря уже о компьютере; Из какого из этих списков легче удалить дубликаты?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

или же

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

Редактировать: После того, как немного заглянул в это (и нашел эта статья), похоже, хотя оба оба выполняют работу, они не являются функционально эквивалентными, или, по крайней мере, они не всегда. Перефразировать пару этих моментов:

  1. array_unique () сортирует значения, как вы отметили, поэтому array_flip (array_flip ()) не будет возвращать одинаковый массив-но это может быть желательно.
  2. Если значения являются объектами, то вы не можете сделать им ключи (верно?), То есть метод FLIP не будет выходить из коробки на всех массивах, тогда как метод сорта работает нормально, независимо от типов значений.

Другие советы

Я думаю Дэн Фего дал замечательный ответ на то, почему можно сортировать массив перед удалением дубликатов; Однако я хотел бы изучить, что array_flip() делает. Я буду использовать следующий массив, чтобы проиллюстрировать:

'a' => 'apple'
'b' => 'banana'
'c' => 'apple'
'd' => 'date'

array_flip() выдыхает ключи и ценности, производящие

'apple'  => 'a'
'banana' => 'b'
'apple'  => 'c'
'date'   => 'd'

Однако ключи должны быть уникальными. А руководство описывает, как array_flip() обрабатывает это:

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

Итак, мы получаем что -то вроде этого:

'banana' => 'b'
'apple' => 'c'
'date' => 'd'

Итак, если мы используем array_flip(array_flip()) мы получаем:

'b' => 'banana'
'c' => 'apple'
'd' => 'date'

Что касается мотивации array_unique(), мы можем только спекулировать, если только Расмус Лердорф или кто -то, в настоящее время работающий над тем, чтобы ответить на Development Development.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top