这指的是我之前的一个问题:array_unique vs array_flip - 这比处理简单字符串和整数时array_flip(array_flip())
要快得多。array_unique()
我想知道的是为什么要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
编辑:经过一番研究(并找到这篇文章),看起来虽然两者都完成了工作,但它们在功能上并不相同,或者至少它们并不总是相同。套用以下几点:
我认为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 开发的人愿意回答。