9

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

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

这两个函数的源代码都可以在这里找到

提前致谢!

4

2 回答 2

18

如果您从算法上考虑,删除重复项的方法是遍历一个列表,跟踪您找到的项目,并删除“找到这个”列表中已经存在的东西。实现此目的的一种简单方法是对列表进行排序。这样一来,有效删除重复项的位置就很明显了。想想你,更别提电脑了;这些列表中的哪一个更容易从中删除重复项?

apple
banana
cantaloupe
apple
durian
apple
banana
cantaloupe

或者

apple
apple
apple
banana
banana
cantaloupe
cantaloupe
durian

编辑:经过一番研究(并找到这篇文章),看起来虽然两者都完成了工作,但它们在功能上并不相同,或者至少它们并不总是相同。套用以下几点:

  1. 如您所述,array_unique() 对值进行排序,因此 array_flip(array_flip()) 不会返回相同排序的数组——但这可能是需要的。
  2. 如果值是对象,那么您不能将它们设为键(对吗?),即翻转方法不能在所有数组上开箱即用,而排序方法可以正常工作,无论值类型如何。
于 2011-12-01T21:43:33.110 回答
0

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

于 2011-12-10T12:58:24.687 回答