为什么array_unique会对值进行排序?

时间:2011-12-01 21:39:29

标签: php sorting array-unique

这是指我之前的一个问题:array_unique vs array_flip - 这表明array_flip(array_flip())在处理简单字符串和整数时比array_unique()快得多。

我想知道的是为什么array_unique()创建数组的副本,对其进行排序然后删除重复项

这两个功能的来源都可用here

提前致谢!

2 个答案:

答案 0 :(得分:18)

如果你在算法上考虑它,删除重复项的方法是通过一个列表,跟踪你找到的项目,并摆脱已经在“找到这个”列表中的东西。一种简单的方法是对列表进行排序。这样很明显在哪里有效地删除重复项。想想你,更别说电脑了;哪个列表更容易从中删除重复?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

编辑:稍微调查一下(并找到this article),看起来两者都完成了工作,但它们在功能上并不相同,或者至少它们并非总是如此。用以下几点来解释:

  1. array_unique()如上所述对值进行排序,因此array_flip(array_flip())不会返回相同排序的数组 - 但这可能是合乎需要的。
  2. 如果值是对象,那么你不能使它们成为键(对吗?),即翻转方法不能在所有数组上开箱即用,而排序方法工作正常,无论价值类型。

答案 1 :(得分:0)

我认为Dan Fego给出了一个很棒的答案,说明为什么要在删除重复数据之前对数组进行排序;但是,我想研究array_flip()的作用。我将使用以下数组来说明:

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

array_flip()用于解释生成

的键和值
'apple'  => 'a'
'banana' => 'b'
'apple'  => 'c'
'date'   => 'd'

但是,密钥必须是唯一的。 manual描述了array_flip()如何处理此问题:

  

如果某个值出现多次,则最新的密钥将用作其值   价值观,所有其他价值都会丢失。

所以我们得到这样的东西:

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

因此,如果我们使用array_flip(array_flip()),我们会得到:

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

至于array_unique()背后的动机,我们只能推测,除非Rasmus Lerdorf或正在进行PHP开发的人关心回答。