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

115

Je travaille avec un tableau unidimensionnel en PHP. Je voudrais 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 souhaite imprimer:

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

Un conseil pour aborder ce problème?

Merci.

Mike

mikey_w
la source

Réponses:

239

Vous pouvez utiliser la fonction array_count_values

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

print_r(array_count_values($array));

sortira

Array
(
   [apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)
Silfverstrom
la source
1
Cette solution ne couvre aucune valeur non entière et non chaîne et en conclusion elle produit des effets secondaires.
codekandis
110
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
Ritvick Paliwal
la source
"... puis comptez le nombre de valeurs en double et sortez les résultats."
showdev
Cette solution ne couvre aucune valeur non entière et non chaîne et en conclusion elle produit des effets secondaires. L'utilisation array_unique($array, SORT_REGULAR)oblige PHP à vérifier les éléments normalement sans changer de type, mais c'est une comparaison vague. Ainsi, différentes instances d'une classe avec le même contenu seront uniques.
codekandis
38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
Anton Maryanov
la source
1
C'est la seule réponse qui renvoie uniquement les valeurs en double.
Redzarf
1
Étendu pour ne donner que la liste des valeurs en double (ce dont j'avais besoin):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard
9

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 ça 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 />";
}
Simon Scarfe
la source
1
Bonne réponse, mais PHP a une fonction existante qui fait exactement cela: array_count_values
Navarr
9

Pour se débarrasser de l'utilisation array_unique(). Pour détecter si vous avez une utilisation count(array_unique())et comparer à count($array).

aksu
la source
2

Les fourrer dans un map(pseudocode)

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

    $m[$word] += 1;
}
Anton Gogolev
la source
2

Peut-être quelque chose comme ça (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 sous forme de clés et leur valeur correspond au nombre de fois où ils ont existé dans le tableau d'origine.


la source
Bonne réponse, mais PHP a une fonction existante qui fait exactement cela: array_count_values
Navarr
0
$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;
uday
la source
0

Je n'ai pas trouvé la réponse que je cherchais, alors j'ai écrit cette fonction. Cela créera un tableau qui ne contiendra que les doublons entre les deux tableaux, mais n'imprimera pas le nombre de fois où un élément est dupliqué, donc cela ne répond 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
)
aswine
la source
0

Une méthode simple:

$array = array_values(array_unique($array, SORT_REGULAR));
la vie
la source
Cela ne compte pas les valeurs non uniques mais les filtre simplement.
m02ph3u5 le