为什么array_unique对这些值进行排序?



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

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

这两个函数的源代码都在这里。

提前感谢!

如果从算法上考虑,删除重复项的方法是遍历列表,跟踪找到的项,并删除已经在"找到此"列表中的项。实现这一点的一个简单方法是对列表进行排序。这样就可以很明显地有效地删除重复项。想你,更别说电脑;这些列表中哪一个更容易删除重复?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

Edit:稍微研究一下(并找到这篇文章)之后,看起来虽然两者都完成了工作,但它们在功能上并不等同,或者至少它们并不总是等同的。套用其中的几个观点:

  1. array_unique()对值进行排序,因此array_flip(array_flip())不会返回相同顺序的数组——但这可能是需要的。
  2. 如果值是对象,那么你不能让它们成为键(对吗?),即flip方法不会在所有数组上开箱工作,而sort方法工作得很好,不管值的类型。

我认为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开发的人关心回答。

相关内容

  • 没有找到相关文章

最新更新