web-dev-qa-db-fra.com

Vérifier et renvoyer les tableaux PHP en double

Je voudrais vérifier si mon tableau a des doublons et retourner les valeurs dupliquées dans un tableau. Je veux que ce soit aussi efficace que possible.

Example :$array = array(1,2,2,4,5)
function returndup($array) should return 2 ;

if array is array(1,2,1,2,5);
it should return an array with 1,2

De plus, le tableau initial comporte toujours 5 positions

27
NVG

ce sera ~ 100 fois plus rapide que array_diff

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

Vous pouvez obtenir la différence entre le tableau d'origine et une copie sans doublons en utilisant array_unique et array_diff_assoc :

array_diff_assoc($arr, array_unique($arr))
15
Gumbo
function array_dup($ar){
   return array_unique(array_diff_assoc($ar,array_unique($ar)));
}

Devrait faire l'affaire.

6
JAL

Vous pouvez faire comme ça:

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

Sortie:

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

        $results[] = $item;
    }

    return $duplicates;
}
1
Ronn0

en plus de la réponse de gumbo:

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

J'ai fait quelques tests et la variante de @ user187291 est en effet la plus rapide. Mais, il s'avère que l'alternative de @ Gumbo et @ faebser est presque aussi rapide, @ faebser étant juste un peu plus rapide que @ Gumbo et parfois même la plus rapide de toutes.

Voici le code que j'ai utilisé

$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
Stefan Gabos

J'ai trouvé un autre moyen de renvoyer les doublons dans un tableau

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
Nemo