Articles
This document is also available in English
En SQL, il existe des fonctions bien pratiques pour effectuer des statistiques, ou des recherches de valeurs distinctes : DISTINCT, pour la dernière, et GROUP BY avec COUNT pour la première.
mysql> select distinct col from table; mysql> select col, count(*) from table group by col;
Mais tout ne vient pas en tables SQL : parfois, c'est livré en tableau PHP, et on a besoin de faire les mêmes calculs, mais sans passer forcément par la base de données.
Pour réaliser ces deux opérations, il y a deux fonctions PHP qui font exactement ce travail.
array_unique() effectue le travail de dédoublonnage. Elle prend un tableau, et retourne la liste des valeurs uniques. La clé de la première valeur rencontrée durant le traitement est conservée.
<?php $x = array('a','a','b','c','a',1, '1', 1.00, array('1'), array('1'), array('2'),array(2), array(2,2)); print_r(array_unique($x)); ?>
Ce qui donne :
Array ( [0] => a [2] => b [3] => c [5] => 1 [8] => Array ( [0] => 1 ) )
Notez quelques comportements particuliers :
Pour le cas de 'a', la première clé rencontrée, ici 0, a été conservée. L'ordre global des clés a été conservé, d'ailleurs.
1, 1.000 et '1' (la chaîne) ont tous été convertis au même format entier. Il faut donc se méfier des tableaux qui contiennent des valeurs hétérogènes.
C'est encore pire avec les tableaux, puisque seul le premier tableau a été conservé. array_unique() n'est pas multi-dimensionnelle.
Pour réaliser des comptes, il y a array_count_values(). Cette fonction prend le meme tableau, rejette les valeurs qui ne sont pas des entiers ou des chaînes, puis fait le compte de chaque valeur qui est trouvée.
<?php $x = array('a','a','b','c','a',1, '1', 1.00, array('1'), array('1'), array('2'),array(2), array(2,2)); print_r(array_unique($x)); ?>
Ce qui donne
( [a] => 3 [b] => 1 [c] => 1 [1] => 2 )
Encore une fois, les entiers et les chaînes sont convertis l'un en l'autre : voyez le cas de 1.
Performances
Paradoxalement, array_unique(), qui en fait mois, se révèle plus lente que array_count_values(), qui en fait plus. Il est donc intéressant de l'utiliser, en conjonction avec array_keys() pour extraire des valeurs distinctes.
Par rapport à SQL, ces fonctions seront plus rapide tant que la table est petite. Jusqu'à un million d'entrée, le temps de remplissage de la table et des index seront rédhibitoire. Par contre, si la table existe déjà, utilisez de préférence SQL pour faire ce type de décompte.
A noter
- array_unique() et array_count_values() n'acceptent pas les mêmes valeurs
- pour classer les valeurs obtenues par array_count_values(), utilisez ksort()
- Il y a d'autres fonctions PHP pour émuler les comportements SQL, que nous verrons bientôt.
| < Précédent | Suivant > |
|---|
Commentaires
Vous pouvez ajouter votre commentaire! |
Vous devez vous connecter pour commenter


