为什么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)后,它看起来像,而两人双双把工作做好,他们不是相同的功能,或至少他们并不总是。套用一对夫妇的这几点:

  1. array_unique()排序值,正如你指出,这样array_flip(array_flip())将不会返回相同的有序阵列 - 但这可能需要的。
  2. 如果这些值是对象,那么你不能使它们成为键(对吧?),即翻转方法不会在所有数组上都不起作用,而排序方法工作正常,无论值类型。
+0

我不得不同意,看文档,有一个可选的参数排序,几乎是一个死的放弃,他们做排序内部比较。 – Tim

+0

使用array_flip(array_flip())给你独特的值,而不需要排序。肯定有更好的方法吗? – Lizard

+1

嗯,这是有道理的,因为值不得不被重复“压扁”。仔细想想,如果阵列的分配是恒定时间的话,那会使操作离开O(n)。要回答你的问题,我不确定为什么内置函数不能做到这一点。 –

我认为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开发工作的人很在意。