Pregunta

Esto se refiere a una de mis preguntas anteriores: array_unique vs array_flip - Esto establece que array_flip(array_flip()) es mucho más rápido que array_unique() Al tratar con cuerdas e enteros simples.

Lo que me gustaría saber es por qué array_unique() crea una copia de la matriz, clasifica y luego eliminó los duplicados

La fuente para ambas funciones está disponible aquí.

¡Gracias por adelantado!

¿Fue útil?

Solución

Si lo piensa algorítmicamente, la forma de eliminar los duplicados es pasar por una lista, realizar un seguimiento de los elementos que encuentre y deshacerse de las cosas que ya están en esa lista de "encontrar esta". Una manera fácil de lograr esto es ordenar una lista. De esa manera, es obvio dónde eliminar los duplicados de manera eficiente. Piensa en ti, y mucho menos en una computadora; ¿Cuál de estas listas es más fácil de eliminar los duplicados?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

o

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

Editar: Después de investigarlo un poco (y encontrar Este artículo), parece que mientras los dos hacen el trabajo, no son funcionalmente equivalentes, o al menos no siempre lo son. Parafraseando un par de estos puntos:

  1. Array_unique () clasifica los valores, como señaló, por lo que Array_Flip (Array_Flip ()) no devolvería la matriz del mismo ordenada, pero esto podría desearse.
  2. Si los valores son objetos, entonces no puede hacerlos claves (¿verdad?), Es decir, el método Flip no funcionaría de la caja en todas las matrices, mientras que el método de clasificación funciona bien, independientemente de los tipos de valor.

Otros consejos

pienso Dan Fego Dio una maravillosa respuesta sobre por qué uno ordenaría una matriz antes de eliminar los duplicados; Sin embargo, me gustaría examinar qué array_flip() lo hace. Usaré la siguiente matriz para ilustrar:

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

array_flip() exhanges las claves y los valores que producen

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

Sin embargo, las claves deben ser únicas. los manual describe cómo array_flip() Maneja esto:

Si un valor tiene varios ocurrencias, la última clave se utilizará como sus valores, y todos los demás se perderán.

Entonces tenemos algo como esto:

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

Entonces si usamos array_flip(array_flip()) obtenemos:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top