Mal*_*ala 57 php arrays duplicates
我确信这是一个非常明显的问题,并且有一个函数正是这样做的,但我似乎无法找到它.在PHP中,我想知道我的数组是否有重复,尽可能高效.我不想像它那样删除它们array_unique,我并不特别想运行array_unique并将它与原始数组进行比较,看看它们是否相同,因为这看起来非常低效.就性能而言,"预期条件"是阵列没有重复.
我只是希望能够做类似的事情
if (no_dupes($array))
// this deals with arrays without duplicates
else
// this deals with arrays with duplicates
Run Code Online (Sandbox Code Playgroud)
我有没有想到的任何明显的功能?
如何检测PHP数组中的重复值?
有正确的标题,是一个非常相似的问题,但如果你真的读过这个问题,他正在寻找array_count_values.
Jas*_*ary 189
我知道你不是在追求array_unique().但是,你不会找到一个神奇的 明显功能,也不会写一个比使用本机功能更快.
我提议:
function array_has_dupes($array) {
// streamline per @Felix
return count($array) !== count(array_unique($array));
}
Run Code Online (Sandbox Code Playgroud)
调整第二个参数array_unique()以满足您的比较需求.
s3m*_*m3n 53
如果你关心性能和微观优化,请检查这个单行:
function no_dupes(array $input_array) {
return count($input_array) === count(array_flip($input_array));
}
Run Code Online (Sandbox Code Playgroud)
描述:
函数$input_array使用array_flip的ed元素比较数组元素的数量.值成为键并猜测 - 键在关联数组中必须是唯一的,因此不会丢失唯一值,并且最终元素数低于原始值.
正如所说手动数组的键可以只类型int或者string所以这是你可以在原来的数组值进行比较,否则PHP将开始铸造有意想不到的效果.
测试用例:
<?php
$elements = array_merge(range(1,10000000),[1]);
$time = microtime(true);
accepted_solution($elements);
echo 'Accepted solution: ', (microtime(true) - $time), 's', PHP_EOL;
$time = microtime(true);
most_voted_solution($elements);
echo 'Most voted solution: ', (microtime(true) - $time), 's', PHP_EOL;
$time = microtime(true);
this_answer_solution($elements);
echo 'This answer solution: ', (microtime(true) - $time), 's', PHP_EOL;
function accepted_solution($array){
$dupe_array = array();
foreach($array as $val){
// sorry, but I had to add below line to remove millions of notices
if(!isset($dupe_array[$val])){$dupe_array[$val]=0;}
if(++$dupe_array[$val] > 1){
return true;
}
}
return false;
}
function most_voted_solution($array) {
return count($array) !== count(array_unique($array));
}
function this_answer_solution(array $input_array) {
return count($input_array) === count(array_flip($input_array));
}
Run Code Online (Sandbox Code Playgroud)
请注意,当没有唯一值接近大数组的开头时,接受的解决方案在某些条件下可能会更快.
Mik*_*rov 38
你可以做:
function has_dupes($array) {
$dupe_array = array();
foreach ($array as $val) {
if (++$dupe_array[$val] > 1) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
And*_*rew 21
$hasDuplicates = count($array) > count(array_unique($array));
Run Code Online (Sandbox Code Playgroud)
将是true如果重复,或者false如果没有重复。
小智 6
$duplicate = false;
if(count(array) != count(array_unique(array))){
$duplicate = true;
}
Run Code Online (Sandbox Code Playgroud)
这是我在进行一些基准测试后对此\xe2\x80\xa6 的看法,我发现这是最快的方法。
\n\nfunction has_duplicates( $array ) {\n return count( array_keys( array_flip( $array ) ) ) !== count( $array );\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\xa6or 根据具体情况,这可能会稍微快一些。
\n\nfunction has_duplicates( $array ) {\n $array = array_count_values( $array );\n rsort( $array );\n return $array[0] > 1;\n}\nRun Code Online (Sandbox Code Playgroud)\n