Почему array_unique сортирует значения? - PullRequest
9 голосов
/ 02 декабря 2011

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 02 декабря 2011

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

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 не будет работать из коробки на всех массивах, , тогда как метод sortработает нормально, независимо от типов значений.
0 голосов
/ 10 декабря 2011

Я думаю, Дэн Фего дал прекрасный ответ о том, почему нужно отсортировать массив перед удалением дубликатов; однако я хотел бы изучить, что делает 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(), мы можем только строить предположения, если Расмус Лердорф или кто-то, кто в настоящее время работает над разработкой PHP, не захочет ответить.

...