質問

これは、以前の質問の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つは両方とも仕事を終わらせ、機能的に同等ではない、または少なくとも常にではないようです。これらのポイントのいくつかを言い換えるには:

  1. array_unique()あなたが指摘したように値をソートするので、array_flip(array_flip())は同一の配列を返しませんが、これが望まれる場合があります。
  2. 値がオブジェクトである場合、キーを作成できません(正しいですか?)、つまり、すべての配列のフリップメソッドが箱から出ていない場合、 一方、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開発に取り組んでいる人が答えなければならない場合を除き、推測することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top