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
ce sera ~ 100 fois plus rapide que array_diff
$dups = array();
foreach(array_count_values($arr) as $val => $c)
if($c > 1) $dups[] = $val;
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))
function array_dup($ar){
return array_unique(array_diff_assoc($ar,array_unique($ar)));
}
Devrait faire l'affaire.
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
function returndup($array)
{
$results = array();
$duplicates = array();
foreach ($array as $item) {
if (in_array($item, $results)) {
$duplicates[] = $item;
}
$results[] = $item;
}
return $duplicates;
}
en plus de la réponse de gumbo:
function returndup($arr)
{
return array_diff_key($arr, array_unique($arr));
}
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>';
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);