2011-12-01 4 views
9

これは以前の質問の1つです。array_unique vs array_flip - 単純な文字列と整数を扱う場合、array_flip(array_flip())array_unique()よりはるかに高速です。 array_unique()が、それはその後、両方の機能のための重複にarray_uniqueが値をソートするのはなぜですか?

ソースを削除ソートhere利用可能である、配列のコピーを作成し、なぜ私が知りたいのですがどのような

です。

ありがとうございます!

答えて

18

アルゴリズム的に考えると、重複を削除する方法は、リストを通過し、見つけたアイテムを追跡し、すでに見つかっているものを取り除くことです。これを達成する簡単な方法の1つは、リストをソートすることです。そうすれば、重複を効率的に取り除くことができます。コンピュータはもちろんのこと、あなたについて考えてみましょう。これらのリストのどれから重複を簡単に削除できますか?

apple 
banana 
cantaloupe 
apple 
durian 
apple 
banana 
cantaloupe 

または

apple 
apple 
apple 
banana 
banana 
cantaloupe 
cantaloupe 
durian 

編集:それにビットを見て(とthis articleを発見)した後、それは2の両方が仕事を成し遂げる一方で、彼らは、機能的に同等ではないように見えますか少なくとも彼らは常にそうではありません。これらの点のカップル言い換えするには:)(

  1. array_uniqueを値をソートし、あなたが述べたように、そうarray_flip(array_flip())を同順の配列を返しません - しかし、これは望ましいことかもしれません。
  2. 値がオブジェクトの場合は、キーを作成できません(つまり、フリップ方法はすべての配列のボックスの外では動作しません)。タイプ。
+0

ドキュメントを見ると、並べ替えのオプションパラメータがあり、並べ替えを使って内部的に比較を行うことはほとんどありません。 – Tim

+0

array_flip(array_flip())を使用すると、並べ替えの必要なく一意の値が得られます。確かに良い方法が必要でしょうか? – Lizard

+1

鍵は重複を持つことができないので、値は "潰れ"なければならないので、意味があります。それについて考えると、配列への代入が一定の時間であれば、O(n)に演算を残します。あなたの質問に答えるために、組み込み関数がなぜ私の頭の上からそれをしないのかわかりません。 –

0

私はDan Fegoが重複を取り除く前に配列を並べ替えるのは素晴らしいと答えました。しかし、私は’ dはarray_flip()が何を調べるのが好きです。私が説明するために、以下の配列を使用することでしょう’:

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

array_flip()しかし

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

を生成するキーと値をexhanges、キーは一意である必要があります。 manualarray_flip()がこれを処理する方法を説明します。値がいくつか発生している場合

、最新のキーは、その 値として使用され、その他はすべて失われます。我々はarray_flip(array_flip())を使用する場合、我々が得るので

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

array_unique()の背後にある動機については
'b' => 'banana' 
'c' => 'apple' 
'd' => 'date' 

、我々は唯一のラスマス・ラードフない限り推測することができます

は、だから我々はこのような何かを得ますあるいは現在PHP開発に取り組んでいる誰かが気にしています。

関連する問題