Array_uniqueが値をソートするのはなぜですか?
-
27-10-2019 - |
質問
これは、以前の質問の1つを指します。 array_unique vs array_flip - これはそれを示しています array_flip(array_flip())
はるかに速いです array_unique()
単純な文字列と整数を扱うとき。
私が知りたいのはその理由です array_unique()
配列のコピーを作成し、それを並べ替えて、重複を削除しました
両方の機能のソースが利用可能です ここ.
前もって感謝します!
解決
アルゴリズム的に考えると、複製を削除する方法は、リストを削除し、見つけたアイテムを追跡し、すでに「この」リストにあるものを取り除くことです。これを達成する簡単な方法の1つは、リストを並べ替えることです。そうすれば、複製を効率的に削除する場所が明らかです。コンピューターは言うまでもなく、あなたのことを考えてください。これらのリストのどれが重複を削除しやすいですか?
apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe
また
apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian
編集: 少し調べた後(そして見つける この記事)、2つは両方とも仕事を終わらせ、機能的に同等ではない、または少なくとも常にではないようです。これらのポイントのいくつかを言い換えるには:
- array_unique()あなたが指摘したように値をソートするので、array_flip(array_flip())は同一の配列を返しませんが、これが望まれる場合があります。
- 値がオブジェクトである場合、キーを作成できません(正しいですか?)、つまり、すべての配列のフリップメソッドが箱から出ていない場合、 一方、sortメソッドは、値タイプに関係なく正常に機能します。
他のヒント
おもう ダンフェゴ 重複を削除する前に配列をソートする理由について素晴らしい答えを与えました。しかし、私は何を調べたいです array_flip()
します。次の配列を使用して説明します。
'a' => 'apple'
'b' => 'banana'
'c' => 'apple'
'd' => 'date'
array_flip()
生成されるキーと値を吐き出します
'apple' => 'a'
'banana' => 'b'
'apple' => 'c'
'date' => 'd'
ただし、キーは一意でなければなりません。 マニュアル その方法について説明します array_flip()
これを処理します:
値にいくつかの発生がある場合、最新のキーはその値として使用され、他のすべてのキーが失われます。
だから私たちはこのようなものを手に入れます:
'banana' => 'b'
'apple' => 'c'
'date' => 'd'
したがって、使用する場合 array_flip(array_flip())
我々が得る:
'b' => 'banana'
'c' => 'apple'
'd' => 'date'
背後の動機については array_unique()
, 、Rasmus lerdorfまたは現在PHP開発に取り組んでいる人が答えなければならない場合を除き、推測することができます。