9

これは私の以前の質問の 1 つを参照しています: array_unique vs array_flip - これは、単純な文字列と整数を扱う場合array_flip(array_flip())よりもはるかに高速であることを示しています。array_unique()

私が知りたいのはarray_unique()、配列のコピーを作成し、並べ替えてから重複を削除する理由です

両方の関数のソースは、こちらから入手できます。

前もって感謝します!

4

2 に答える 2

18

アルゴリズム的に考えると、重複を削除する方法は、リストを調べて、見つけたアイテムを追跡し、「見つかった」リストに既にあるものを取り除くことです。これを実現する簡単な方法の 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. 値がオブジェクトの場合、それらをキーにすることはできません (そうですか?)。つまり、値の型に関係なく、並べ替えメソッドは正常に機能しますが、フリップ メソッドはすべての配列でそのままでは機能しません。
于 2011-12-01T21:43:33.110 に答える
0

重複を削除する前に配列をソートする理由について、 Dan Fegoがすばらしい回答をしたと思います。ただし、何が機能するかを調べたいと思い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 開発に取り組んでいる誰かが答えようとしない限り、推測することしかできません。

于 2011-12-10T12:58:24.687 に答える