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