Compter le nombre de valeurs différentes d’un tableau

Il est très facile de connaître le nombre d'éléments que contient un tableau. Il suffit d'utiliser la fonction count.

$var = ['1', '2', 3, 'a', 2, 3];
$size = count($var);
// $size => 6

Mais comment faites-vous pour compter le nombre d'éléments différents d'un tableau ?

Plusieurs possibilités :

  • En utilisant array_unique :
$var = ['1', '2', 3, 'a', 2, 3];
$uniqueValue = array_unique($var);
$size = count($uniqueValue);

// $size => 4

4 ? pourquoi pas 5 ? Car pour faire la comparaison, array_unique converti les éléments en string. Donc finalement, il compare ['1', '2', '3', 'a', '2', '3'].

Et attention si vous avez des boolean ou des valeurs null dans votre tableau.

$var = [1, true, 0, false, null];
$uniqueValue = array_unique($var);
$size = count($uniqueValue);

// $size => 3

true et false sont convertis respectivement en '1' et '0', null converti en chaîne vide ''.

  • array_count_values : cette méthode permet de compter le nombre occurrences de chaque valeur dans un tableau
$var = ['1', '2', 3, 'a', 2, 3];
var_export(array_count_values($var));
/*
array (
  1 => 1,
  2 => 2,
  3 => 2,
  "a" => 1,
)
*/

On voit ici que la méthode convertie les chaînes de type entier en entier.

$var = [1, '2', 3, 4, 2, 3];
$numberByUniqueValue = array_count_values($var);
$size = count($numberByUniqueValue);

// $size => 4

Et donc on voit qu'avec cette méthode, on a le même résultat...

$var = [1, true, 0, false, null];
$numberByUniqueValue = array_count_values($var);
$size = count($numberByUniqueValue);

// $size => 2

Le résultat n'est pas le même qu'avec array_unique car cette méthode ne peut compter que les chaînes et les entiers. PHP nous remonte des warning pour nous informer qu'il ignore les valeurs.

Warning: array_count_values(): Can only count string and integer values, entry skipped in
Warning: array_count_values(): Can only count string and integer values, entry skipped in
Warning: array_count_values(): Can only count string and integer values, entry skipped in

Donc rien de très satisfaisant. Après je prends ici des cas un peu extrêmes, j'espère pour vous que vos tableaux ne sont pas des mélanges de type comme ci-dessus.

  • Si vous avez vraiment besoin pour des cas un peu complexe, voici une manière simple de faire :
$var = [1, true, 0, false, null, '', '1', 2, 3, 3];
$uniqueValues = [];

foreach ($var as $item) {
    if (false === in_array($item, $uniqueValues, true)) {
        $uniqueValues[] = $item;
    }
    
}

$size = count($uniqueValues);

Ce qui fait toute la différence ici est le 3ᵉ paramètre true à la fonction in_array qui compare le type en plus de la valeur.

Vous aimeriez progresser en PHP ? Mais vous ne savez pas comment vous y prendre ?

S'entraîner pour progresser en PHP

Mon programme "S'entraîner pour progresser en PHP" est disponible. Il vous permettra de recevoir chaque semaine un kata de code directement dans votre boîte mail, ainsi que des aides à la réalisation, des vidéos explicatives et des défis supplémentaires.

Reçois dès maintenant un kata gratuit en cliquant sur le bouton ci-dessous.