web-dev-qa-db-fra.com

Comment détecter les valeurs en double dans PHP tableau?

Je travaille avec un tableau unidimensionnel en PHP. J'aimerais détecter la présence de valeurs en double, puis compter le nombre de valeurs en double et sortir les résultats. Par exemple, étant donné le tableau suivant:

$array = array('Apple', 'orange', 'pear', 'banana', 'Apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');

Je voudrais imprimer:

Apple (2)
orange
pear (2)
banana
kiwi (3)

Des conseils sur la façon d'aborder ce problème?

Merci.

Mike

97
mikey_w

Vous pouvez utiliser array_count_values ​​ function

$array = array('Apple', 'orange', 'pear', 'banana', 'Apple',
'pear', 'kiwi', 'kiwi', 'kiwi');

print_r(array_count_values($array));

va sortir

Array
(
   [Apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)
210
Silfverstrom
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
99
Ritvick Paliwal
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
30
Anton Maryanov

Pour vous en débarrasser, utilisez array_unique(). Pour détecter si vous utilisez count(array_unique()) et comparez-le à count($array).

8
helpful tip

Vous pouvez essayer de transformer ce tableau en un tableau associatif avec les fruits comme clés et le nombre d'occurrences comme valeurs. Un peu long, mais il ressemble à:

$array = array('Apple', 'orange', 'pear', 'banana', 'Apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');
$new_array = array();
foreach ($array as $key => $value) {
    if(isset($new_array[$value]))
        $new_array[$value] += 1;
    else
        $new_array[$value] = 1;
}
foreach ($new_array as $fruit => $n) {
    echo $fruit;
    if($n > 1)
        echo "($n)";
    echo "<br />";
}
6
Simon Scarfe
<?php

$arr = array(1, 2, 3, 2, 5, 6, 7);

print_r(array_count_values($arr));

?>
3
tarun

Farcissez-les dans une map (pseudocode)

map[string -> int] $m
foreach($Word in $array)
{
    if(!$m.contains($Word))
        $m[$Word] = 0;

    $m[$Word] += 1;
}
2
Anton Gogolev

Peut-être quelque chose comme ceci (code non testé mais devrait vous donner une idée)?

$new = array();

foreach ($array as $value)
{
    if (isset($new[$value]))
        $new[$value]++;
    else
        $new[$value] = 1;
}

Ensuite, vous obtiendrez un nouveau tableau avec les valeurs en tant que clés et leur valeur correspond au nombre de fois où ils ont existé dans le tableau d'origine.

2
$count = 0;
$output ='';
$ischeckedvalueArray = array();
for ($i=0; $i < sizeof($array); $i++) {
    $eachArrayValue = $array[$i];
    if(! in_array($eachArrayValue, $ischeckedvalueArray)) {
        for( $j=$i; $j < sizeof($array); $j++) {
            if ($array[$j] === $eachArrayValue) {
                $count++;
            }
        }
        $ischeckedvalueArray[] = $eachArrayValue;
        $output .= $eachArrayValue. " Repated ". $count."<br/>";
        $count = 0;
    }

}

echo $output;
0
uday

Je n'ai pas trouvé la réponse que je cherchais, alors j'ai écrit cette fonction. Cela fera un tableau qui ne contient que les doublons entre les deux tableaux, mais n'indiquera pas le nombre de fois qu'un élément est dupliqué, il ne répond donc pas directement à la question, mais j'espère que cela aidera quelqu'un dans ma situation.

function findDuplicates($array1,$array2)
{
    $combined = array_merge($array1,$array2);
    $counted = array_count_values($combined);
    $dupes = [];
    $keys = array_keys($counted);
    foreach ($keys as $key)
    {   
        if ($counted[$key] > 1)
        {$dupes[] = $key;}
    }
    sort($dupes);
    return $dupes;
}
$array1 = [1,2,3,4,5];
$array2 = [4,5,6,7,8];
$dupes = findDuplicates($array1,$array2);
print_r($dupes);

Les sorties:

Array
(
    [0] => 4
    [1] => 5
)
0
aswine