Articles

Le mois de la fonction PHP : statistiques SQL

  • Ecrit par Damien Seguy
  • mardi 27 mars 2007
Image pour le titre du contenu

This document is also available in English en 


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
< Précédent   Suivant >

Commentaires

Vous pouvez ajouter votre commentaire!


Vous devez vous connecter pour commenter