这是我之前的一个问题: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:稍微研究一下(并找到这篇文章)之后,看起来虽然两者都完成了工作,但它们在功能上并不等同,或者至少它们并不总是等同的。套用其中的几个观点:
- array_unique()对值进行排序,因此array_flip(array_flip())不会返回相同顺序的数组——但这可能是需要的。
- 如果值是对象,那么你不能让它们成为键(对吗?),即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开发的人关心回答。