Почему array_unique сортирует значения?

Это относится к одному из моих предыдущих вопросов: array_unique vs array_flip – это array_flip(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() , мы можем только догадываться, если Rasmus Lerdorf или кто-то, кто в настоящее время работает над разработкой PHP, должен ответить.