Frage

Dies bezieht sich auf eine meiner vorherigen Fragen: Array_unique vs array_flip - Dies besagt, dass array_flip(array_flip()) ist viel schneller als array_unique() Im Umgang mit einfachen Saiten und Ganzzahlen.

Was ich wissen möchte, ist warum array_unique() Erstellt eine Kopie des Arrays, sortiert es dann dann die Duplikate entfernt

Die Quelle für beide Funktionen ist verfügbar hier.

Danke im Voraus!

War es hilfreich?

Lösung

Wenn Sie algorithmisch darüber nachdenken, können Sie die Art und Weise, wie Sie Duplikate entfernen, eine Liste durchlaufen, Artikel verfolgen und Dinge entfernen und Dinge loswerden, die bereits in dieser "diese" -Liste enthalten sind. Eine einfache Möglichkeit, dies zu erreichen, besteht darin, eine Liste zu sortieren. Auf diese Weise ist es offensichtlich, wo Duplikate effizient entfernt werden können. Denken Sie an Sie, geschweige denn an einen Computer. Aus welcher dieser Listen ist es einfacher, Duplikate zu entfernen?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

oder

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

Bearbeiten: Nachdem Sie es ein bisschen untersucht haben (und finden Dieser Artikel), Es sieht so aus, als ob beide die Arbeit erledigen, aber sie sind nicht funktional gleichwertig, oder zumindest sind sie nicht immer. Um ein paar dieser Punkte zu paraphrasieren:

  1. Array_unique () sortiert die Werte, wie Sie bemerkt haben, so array_flip (array_flip ()) würde nicht das gleichorientierte Array zurückgeben-aber dies könnte erwünscht werden.
  2. Wenn die Werte Objekte sind, können Sie sie nicht Tasten (richtig?) Erstellen, dh die Flip -Methode würde bei allen Arrays nicht über die Box funktionieren. Die Sortiermethode funktioniert unabhängig von den Werttypen einwandfrei.

Andere Tipps

Ich finde Dan Fego gab eine wundervolle Antwort darauf, warum man ein Array sortieren würde, bevor man Duplikate entfernen; Ich möchte jedoch untersuchen, was array_flip() tut. Ich werde das folgende Array verwenden, um zu veranschaulichen:

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

array_flip() reduziert die Tasten und Werte, die produzieren

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

Die Schlüssel müssen jedoch einzigartig sein. Das Handbuch beschreibt wie array_flip() verarbeitet das:

Wenn ein Wert mehrere Ereignisse aufweist, wird der neueste Schlüssel als Werte verwendet, und alle anderen gehen verloren.

Also bekommen wir so etwas:

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

Also, wenn wir verwenden array_flip(array_flip()) wir bekommen:

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

Was die Motivation dahinter betrifft array_unique(), Wir können nur spekulieren, es sei denn, Rasmus Lerdorf oder jemand, der derzeit an der PHP -Entwicklung arbeitet, kümmert sich darum zu beantworten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top