检查并返回重复的数组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',
    ),
)
*/