为什么array_unique对值进行排序?
问题描述:
这是指我之前的一个问题:array_unique vs array_flip - 这表明array_flip(array_flip())
比处理简单字符串和整数时的array_unique()
快得多。为什么array_unique对值进行排序?
我想知道的是为什么array_unique()
创建数组的一个副本,然后进行排序它删除重复的
源两种功能可here。
在此先感谢!
答
如果您在算法上考虑它,删除重复项的方法是通过列表,跟踪找到的项目,并删除已在“找到此”列表中的东西。完成这项工作的一个简单方法是对列表进行排序。这样,很明显在哪里有效地删除重复项。想想你,更不用说计算机了;哪些列表中的哪一个更容易删除重复项?
apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe
或
apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian
编辑:寻找到了一点(和寻找this article)后,它看起来像,而两人双双把工作做好,他们不是相同的功能,或至少他们并不总是。套用一对夫妇的这几点:
- array_unique()排序值,正如你指出,这样array_flip(array_flip())将不会返回相同的有序阵列 - 但这可能需要的。
- 如果这些值是对象,那么你不能使它们成为键(对吧?),即翻转方法不会在所有数组上都不起作用,而排序方法工作正常,无论值类型。
答
我认为Dan Fego给出了一个精彩的答案,为什么要在删除重复项之前排序数组;然而,我想’ d要检查什么array_flip()
。我’会使用以下数组来说明:
'a' => 'apple'
'b' => 'banana'
'c' => 'apple'
'd' => 'date'
array_flip()
exhanges的键和值产生
'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()
的动机,我们只能推测,除非拉斯姆斯·勒多夫或者目前正在从事PHP开发工作的人很在意。
我不得不同意,看文档,有一个可选的参数排序,几乎是一个死的放弃,他们做排序内部比较。 – Tim
使用array_flip(array_flip())给你独特的值,而不需要排序。肯定有更好的方法吗? – Lizard
嗯,这是有道理的,因为值不得不被重复“压扁”。仔细想想,如果阵列的分配是恒定时间的话,那会使操作离开O(n)。要回答你的问题,我不确定为什么内置函数不能做到这一点。 –