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

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

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
}

"... 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 ) );
}

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 />";
}

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


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

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.


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;

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
)

0

Une méthode simple:

$array = array_values(array_unique($array, SORT_REGULAR));

Cela ne compte pas les valeurs non uniques mais les filtre simplement.
m02ph3u5 le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.