检查并返回重复的数组php
我想检查我的数组是否有任何重复项,并返回数组中的重复值。 我希望这是尽可能有效的 例如:检查并返回重复的数组php,php,arrays,duplicates,Php,Arrays,Duplicates,我想检查我的数组是否有任何重复项,并返回数组中的重复值。 我希望这是尽可能有效的 例如: $array = array( 1, 2, 2, 4, 5 ); function return_dup($array); // should return 2 $array2 = array( 1, 2, 1, 2, 5 ); function return_dup($array2); // should return an array with 1,2 此外,初始数组的长度始终为5个位置,您可以使用
$array = array( 1, 2, 2, 4, 5 );
function return_dup($array); // should return 2
$array2 = array( 1, 2, 1, 2, 5 );
function return_dup($array2); // should return an array with 1,2
此外,初始数组的长度始终为5个位置,您可以使用和获得原始数组和副本的差异,而无需重复:
function returndup($array)
{
$results = array();
$duplicates = array();
foreach ($array as $item) {
if (in_array($item, $results)) {
$duplicates[] = $item;
}
$results[] = $item;
}
return $duplicates;
}
除了秋葵的回答外,你还应该这样做。:
function returndup($arr)
{
return array_diff_key($arr, array_unique($arr));
}
您可以这样做:
function showDups($array)
{
$array_temp = array();
foreach($array as $val)
{
if (!in_array($val, $array_temp))
{
$array_temp[] = $val;
}
else
{
echo 'duplicate = ' . $val . '<br />';
}
}
}
$array = array(1,2,2,4,5);
showDups($array);
这将比阵列_diff快约100倍
$dups = array();
foreach(array_count_values($arr) as $val => $c)
if($c > 1) $dups[] = $val;
我找到了在数组中返回重复项的另一种方法
function printRepeating($arr, $size)
{
$i;
$j;
for($i = 0; $i < $size; $i++)
for($j = $i + 1; $j < $size; $j++)
if($arr[$i] == $arr[$j])
echo $arr[$i], " ";
}
printRepeating($array, sizeof($array,0);
函数打印重复($arr,$size)
{
$i;
$j;
对于($i=0;$i<$size;$i++)
对于($j=$i+1;$j<$size;$j++)
如果($arr[$i]==$arr[$j])
echo$arr[$i],“”;
}
printRepeating($array,sizeof($array,0);
$duplicate_array=array()
对于($i=0;$i我做了一些测试,事实上@user187291的变体是最快的。但是,事实证明@Gumbo和@faebser的替代品几乎一样快,@faebser的速度略快于@Gumbo,有时甚至是最快的
这是我使用的代码
$array = array(1, "hello", 1, "world", "hello");
$times = 1000000;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
$dups = array();
foreach(array_count_values($array) as $val => $c)
if( $c > 1) $dups[] = $val;
}
$end = microtime(true);
echo 'variant 1 (user187291): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_unique(array_diff_assoc($array, array_unique($array)));
$end = microtime(true);
echo 'variant 2 (JAL): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_diff_assoc($array, array_unique($array));
$end = microtime(true);
echo 'variant 3 (Gumbo): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_diff_key($array, array_unique($array));
$end = microtime(true);
echo 'variant 4 (faebser): ' . ($end - $start);
echo '<br><br><br>';
$array=array(1,“你好”,1,“世界”,“你好”);
$times=1000000;
$start=microtime(真);
对于($i=0;$i<$times;$i++){
$dups=array();
foreach(数组\计数\值($array)为$val=>$c)
如果($c>1)$dups[]=$val;
}
$end=微时间(真);
回显“变体1(user187291):”($end-$start);
回音“
”;
$start=microtime(真);
对于($i=0;$i<$times;$i++)
$dups=array_unique(array_diff_assoc($array,array_unique($array));
$end=微时间(真);
echo“变体2(日航):”($end-$start);
回音“
”;
$start=microtime(真);
对于($i=0;$i<$times;$i++)
$dups=array_diff_assoc($array,array_unique($array));
$end=微时间(真);
echo“变体3(秋葵):”($end-$start);
回音“
”;
$start=microtime(真);
对于($i=0;$i<$times;$i++)
$dups=array_diff_key($array,array_unique($array));
$end=微时间(真);
回音“变体4(faebser):”($end-$start);
回音“
”;
如果您需要一个能够处理数组(或除整数或字符串以外的任何数组值)的解决方案,请尝试以下方法:
function return_dup( $arr ) {
$dups = array();
$temp = $arr;
foreach ( $arr as $key => $item ) {
unset( $temp[$key] );
if ( in_array( $item, $temp ) ) {
$dups[] = $item;
}
}
return $dups;
}
$arr = array(
array(
0 => 'A',
1 => 'B',
),
array(
0 => 'A',
1 => 'B',
),
array(
0 => 'C',
1 => 'D',
),
array(
0 => 'C',
1 => 'D',
),
array(
0 => 'E',
1 => 'F',
),
array(
0 => 'F',
1 => 'E',
),
array(
0 => 'Y',
1 => 'Z',
),
);
var_export( return_dup( $arr ) );
/*
array (
0 => array (
0 => 'A',
1 => 'B',
),
1 => array (
0 => 'C',
1 => 'D',
),
)
*/
不是OP要求的。他们说它应该能够返回多个值。现在它返回一个重复的数组。在第一篇文章中,没有通知is需要返回多个重复的值,所以不要怪我!事实上,有:“如果数组是数组(1,2,1,2,5);它应该返回一个带有1,2的数组”做了一个非常快速的基准测试,对我来说,你的方法出来的速度只有JAL的array_diff方法的两倍,而不是100倍。非常确定它是@peterNote,array_count_values
只接受字符串和整数值,所以如果你的输入数组可能包含其他类型的值,这不是一个好的选择。但它确实有效例如,在问题中,情况看起来只是一个整数数组。在O(n^3),这绝对是最慢的方法。这对我来说很有效,谢谢!
function printRepeating($arr, $size)
{
$i;
$j;
for($i = 0; $i < $size; $i++)
for($j = $i + 1; $j < $size; $j++)
if($arr[$i] == $arr[$j])
echo $arr[$i], " ";
}
printRepeating($array, sizeof($array,0);
for($i=0;$i<count($array);$i++){
for($j=0;$j<count($array);$j++){
if($i != $j && $array[$i] == $array[$j]){
if(!in_array($array[$j], $duplicate_array)){
$duplicate_array[] = $array[$j];
}
}
}
}
$array = array(1, "hello", 1, "world", "hello");
$times = 1000000;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
$dups = array();
foreach(array_count_values($array) as $val => $c)
if( $c > 1) $dups[] = $val;
}
$end = microtime(true);
echo 'variant 1 (user187291): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_unique(array_diff_assoc($array, array_unique($array)));
$end = microtime(true);
echo 'variant 2 (JAL): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_diff_assoc($array, array_unique($array));
$end = microtime(true);
echo 'variant 3 (Gumbo): ' . ($end - $start);
echo '<br><br><br>';
$start = microtime(true);
for ($i = 0; $i < $times; $i++)
$dups = array_diff_key($array, array_unique($array));
$end = microtime(true);
echo 'variant 4 (faebser): ' . ($end - $start);
echo '<br><br><br>';
function return_dup( $arr ) {
$dups = array();
$temp = $arr;
foreach ( $arr as $key => $item ) {
unset( $temp[$key] );
if ( in_array( $item, $temp ) ) {
$dups[] = $item;
}
}
return $dups;
}
$arr = array(
array(
0 => 'A',
1 => 'B',
),
array(
0 => 'A',
1 => 'B',
),
array(
0 => 'C',
1 => 'D',
),
array(
0 => 'C',
1 => 'D',
),
array(
0 => 'E',
1 => 'F',
),
array(
0 => 'F',
1 => 'E',
),
array(
0 => 'Y',
1 => 'Z',
),
);
var_export( return_dup( $arr ) );
/*
array (
0 => array (
0 => 'A',
1 => 'B',
),
1 => array (
0 => 'C',
1 => 'D',
),
)
*/