2011-12-01 27 views

Respuesta

18

Si lo piensas algorítmicamente, la forma de eliminar duplicados es ir a través de una lista, realizar un seguimiento de los elementos que encuentres y deshacerte de los que ya están en esa lista "encontrado esto". Una manera fácil de lograr esto es ordenar una lista. De esta forma, es obvio dónde eliminar duplicados de manera eficiente. Piensa en ti, y mucho menos en una computadora; ¿Cuál de estas listas es más fácil eliminar duplicados?

apple 
banana 
cantaloupe 
apple 
durian 
apple 
banana 
cantaloupe 

o

apple 
apple 
apple 
banana 
banana 
cantaloupe 
cantaloupe 
durian 

Editar: Después de buscar en ella un poco (y encontrar this article), parece que mientras que los dos tanto hacer el trabajo, no son funcionalmente equivalente, o al menos no son siempre Parafraseando a un par de estos puntos:

  1. array_unique() ordena los valores, como usted señaló, por lo array_flip (array_flip()) no devolvería la misma serie ordenada - pero esto podría desear.
  2. Si los valores son objetos, no se pueden convertir en claves (¿no?), Es decir, el método de volteo no funcionaría de manera predeterminada en todas las matrices, mientras que el método de clasificación funciona bien, independientemente del valor tipos.
+0

Tendría que estar de acuerdo, mirando la documentación, hay un parámetro opcional para la clasificación, casi un don de que hacen las comparaciones internamente con la clasificación. – Tim

+0

usando array_flip (array_flip()) le proporciona valores únicos sin la necesidad de ordenarlos. Debe haber una mejor manera seguramente? – Lizard

+1

Bueno, eso tiene sentido, ya que los valores tendrán que ser "aplastados" ya que las claves no pueden tener duplicados. Pensando en eso, eso dejaría la operación en O (n) si las asignaciones a la matriz son de tiempo constante. Para responder a su pregunta, no estoy seguro de por qué la función incorporada no hace eso en la parte superior de mi cabeza. –

0

creo Dan Fego dio una maravillosa contestado cuanto a por qué se podría ordenar una matriz antes de la eliminación de duplicados; sin embargo, I ’ d desea examinar lo que hace array_flip(). I ’ estaré utilizando la siguiente matriz para ilustrar:

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

array_flip() exhanges las claves y valores producir

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

Sin embargo, las claves deben ser únicos. El manual describe cómo maneja esta array_flip():

Si un valor se encuentra varias veces, la última clave será usada como sus valores , y todos los demás se perderá.

por lo que obtener algo como esto:

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

Así que si utilizamos array_flip(array_flip()) obtenemos:

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

En cuanto a la motivación detrás de array_unique(), sólo podemos especular menos Rasmus Lerdorf o alguien que actualmente trabaja en desarrollo de PHP se preocupa por responder.

Cuestiones relacionadas