检查并返回PHP中的重复数组

55

我想检查我的数组是否有任何重复,并返回一个包含这些重复值的数组。我希望这个方法尽可能地高效。

例子:

$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个位置

11个回答

115

这将比array_diff快大约100倍。

$dups = array();
foreach(array_count_values($arr) as $val => $c)
    if($c > 1) $dups[] = $val;

19
我进行了一个非常快速的基准测试,对我而言,你的方法只比JAL的array_diff方法快两倍,而不是快100倍。 - Dom
1
相当确定这样做 @peter - Shardj
2
请注意,array_count_values 仅接受字符串和整数值作为输入,因此如果您的输入数组可能包含其他类型的值,则这不是一个好的选择。但它对于问题中的示例确实有效,因为那里的情况似乎可靠地只是一个整数数组。 - squarecandy

39

使用 array_uniquearray_diff_assoc 可以获取原始数组和不含重复项的副本之间的差异:

array_diff_assoc($arr, array_unique($arr))

到了2023年,这将比array_count_values更快。 - silvered.dragon

8
function array_dup($ar){
   return array_unique(array_diff_assoc($ar,array_unique($ar)));
}

应该可以解决问题。

6
您可以像这样做:
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);

输出:

duplicate = 2

2
function returndup($array) 
{
    $results = array();
    $duplicates = array();
    foreach ($array as $item) {
        if (in_array($item, $results)) {
            $duplicates[] = $item;
        }

        $results[] = $item;
    }

    return $duplicates;
}

不是OP要求的。他们说它应该能够返回多个值。 - Ash Burlaczenko
现在它返回一个重复项数组。在第一篇帖子中没有注意到需要返回多个重复项,所以不要责怪我! - Ronn0
1
实际上,它应该返回一个包含1、2的数组,如果数组是array(1,2,1,2,5)。 - ToolmakerSteve

1

除了gumbo的回答之外:

function returndup($arr)
{
  return array_diff_key($arr, array_unique($arr));
}

1

我进行了一些测试,确实@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>';

0
根据您的问题,如果您有重复的值,则必须返回这些值。我为此问题编写了一个函数。如果您的数组具有重复的值,则此函数将在数组中返回这些值,否则它将返回空值。以下是一个示例:
function containsDuplicate($array_values) {
    $duplicates_values = [];
    for($i = 0; $i < count($array_values); $i++){
        for ($j=$i+1; $j <count($array_values) ; $j++) { 
            if ($array_values[$i] == $array_values[$j]) {
                $duplicates_values[] =  $array_values[$i];
            }
        }
    
    }
    if(count($duplicates_values) > 0){
        return $duplicates_values;
    }
}

时间复杂度太高了。其他答案更直接,更优雅。在每次迭代中不应该调用count()if(count($duplicates_values) > 0){可以改为if ($duplicates_values) {,但是为什么有人想要编写一个带有条件return的函数呢? - mickmackusa

0

我已经找到了另一种在数组中返回重复项的方法

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);

0
如果您需要一个可以处理数组(或任何非整数或字符串数组值)的解决方案,请尝试这个:
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',
    ),
)
*/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接