2011-12-01 4 views

Répondre

18

Si vous y réfléchissez de façon algorithmique, la façon d'éliminer les doublons est de parcourir une liste, de garder une trace des éléments que vous trouvez et de vous débarrasser de ce qui se trouve déjà dans cette liste. Un moyen facile d'accomplir ceci est de trier une liste. De cette façon, il est évident d'où supprimer efficacement les doublons. Pensez à vous, sans parler d'un ordinateur; laquelle de ces listes est plus facile de supprimer les doublons?

apple 
banana 
cantaloupe 
apple 
durian 
apple 
banana 
cantaloupe 

ou

apple 
apple 
apple 
banana 
banana 
cantaloupe 
cantaloupe 
durian 

Edit: Après avoir examiné un peu (et trouver this article), il ressemble alors que les deux à la fois faire le travail fait, ils ne sont pas fonctionnellement équivalent, ou au moins ils ne sont pas toujours. Pour paraphraser un couple de ces points:

  1. array_unique() trie les valeurs, comme vous l'avez dit, si array_flip (array_flip()) ne retourne le tableau de même ordre - mais cela pourrait désirer.
  2. Si les valeurs sont des objets, alors vous ne pouvez pas les rendre clés (à droite?), Ie la méthode flip ne fonctionnerait pas sur tous les tableaux, alors que la méthode de tri fonctionne bien, quelle que soit la valeur les types.
+0

Je serais d'accord, en regardant la documentation, il y a un paramètre facultatif pour le tri, presque un mort donne qu'ils font les comparaisons en interne avec le tri. – Tim

+0

en utilisant array_flip (array_flip()) vous donne des valeurs uniques sans avoir besoin de trier. Il doit sûrement y avoir un meilleur moyen? – Lizard

+1

Eh bien, cela a du sens, car les valeurs devront être "écrasées" car les clés ne peuvent pas avoir de doublons. En y réfléchissant, cela laisserait l'opération à O (n) si les affectations au tableau sont à temps constant. Pour répondre à votre question, je ne sais pas pourquoi la fonction intégrée ne le fait pas du haut de ma tête. –

0

Je pense que Dan Fego a donné une merveilleuse réponse à pourquoi on trier un tableau avant la suppression des doublons; Cependant, je voudrais examiner ce que fait array_flip(). Je ’ vais utiliser le tableau suivant pour illustrer:

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

array_flip() exhanges les clés et les valeurs de production

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

Cependant, les clés doivent être uniques. Le manual décrit comment array_flip() poignées ceci:

Si une valeur a plusieurs occurrences, la dernière clé sera utilisée comme ses valeurs, et tous les autres seront perdus.

donc nous obtenons quelque chose comme ceci:

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

Donc, si nous utilisons array_flip(array_flip()) nous obtenons:

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

En ce qui concerne la motivation derrière array_unique(), nous ne pouvons que spéculer à moins que Rasmus Lerdorf ou quelqu'un qui travaille actuellement sur le développement PHP se soucie de répondre.