Tableaux PHP : in_array contre isset

Une petite expérience en PHP : faire le bon choix entre in_array et isset pour rechercher une valeur dans un tableau.

Les tableaux avec isset() et in_array()

Imaginons que je veuille stocker des valeurs dans un tableau, puis vérifier si certaines valeurs sont présentes dans ce tableau. Je pourrais procéder de deux façons :

Avec in_array

Pour créer le tableau, rien de bien compliqué :

<?php
$tableau = array();
$tableau[] = 'HTML5';
$tableau[] = 'CSS';
$tableau[] = 'PHP';
$tableau[] = 'Javascript';
?>

Pour vérifier l'existence d'une valeur, il faudrait utiliser in_array() :

<?php
if (in_array('PHP', $tableau))
	echo 'Trouvé !';
?>

Avec isset

Il existe une autre méthode pour aboutir à ce résultat : se servir de la fonction isset().

Pour créer le tableau, au lieu d'utiliser les valeurs du tableau pour stocker les données, il suffit d'utiliser les clés :

<?php
$tableau = array();
$tableau['HTML5'] = true;
$tableau['CSS'] = true;
$tableau['PHP'] = true;
$tableau['Javascript'] = true;
?>

Pour vérifier l'existence d'une valeur, il faudrait utiliser le code suivant :

<?php
if (isset($tableau['PHP']))
	echo 'Trouvé !';
?>

Les différences

Quelles sont les différences entre la méthode in_array et la méthode isset ?

La principale différence entre ces deux méthodes est qu'en utilisant isset, il sera impossible d'avoir deux entrées possédant la même valeur :

in_array

<?php
// Avec in_array()
$tableau = array();
$tableau[] = 'HTML5';
$tableau[] = 'HTML5';
?>

isset

<?php
// Avec isset
$tableau = array();
$tableau['HTML5'] = true;
$tableau['HTML5'] = true;
?>

On remarque ici, qu'avec la deuxième méthode, le tableau ne contiendra qu'un seul élément. Si on souhaite pouvoir stocker des doublons dans notre tableau, il est donc impossible d'utiliser la méthode isset.

Les autres différences entre ces deux méthodes ne touchent pas à la logique du code, mais à la performance. Pour les tests suivants, je me suis focalisé sur deux indicateurs : la mémoire utilisée et le temps de traitement.

Pour ce faire, nous allons remplir un tableau de manière aléatoire, puis vérifier la présence de certaines valeurs aléatoires. Nous allons effectuer ce test pour un tableau vide, puis un tableau de 10, 100, 1 000, 10 000, 20 000, 50 000 et 100 000 valeurs.

Afin que les données soient le plus complètes possibles, les mesures effectuées prendront en compte aussi bien le remplissage des tableaux, que la vérification de l'existence des valeurs.

La mémoire utilisée

Il peut être intéressant de comparer l'utilisation de mémoire qu'offrent ces deux méthodes. Nous allons donc mesurer la quantité maximale de mémoire utilisée pendant l'exécution de ces scripts :

Comparatif de la mémoire utilisée (en octets) entre isset et in_array
Taille du tableau Mémoire utilisée par isset Mémoire utilisée par in_array
0 408 408
10 1 248 1 240
100 8 896 8 888
1 000 84 472 84 488
10 000 865 928 865 960
20 000 1 731 520 1 731 504
50 000 4 262 576 4 262 584
100 000 8 524 712 8 524 720

On constate que les deux méthodes utilisent la même quantité de mémoire. Ca n'est donc pas un facteur déterminant pour le choix entre ces deux fonctions PHP.

Le temps de traitement

La rapidité d'exécution d'un script étant un élément très important, comparons le temps que mettent ces deux méthodes pour aboutir au résultat désiré.

Modifions un peu le code utilisé précédemment, afin qu'il calcule combien de temps a duré le traitement selon chaque méthode :

Comparatif du temps de traitement (en millisecondes) entre isset et in_array
Taille du tableau Temps pris par isset Temps pris par in_array
0 0 0
10 0 0
100 0 0
1 000 0 10
10 000 0 800
20 000 10 2 560
50 000 20 10 760
100 000 40 18 363

Malgré un temps d'exécution quasi nul pour des tableaux possédant entre 0 et 100 entrées, on constate d'énormes différences quand les tableaux grossissent :

Isset prend très peu de temps à s'exécuter, même avec des tableaux de 100 000 entrées.

En revanche, in_array est de plus en plus lent à retrouver une valeur dans un tableau. Pour un tableau de 100 000 entrées, il est 459 fois plus lent que isset !

Conclusion

Isset possède un avenir radieux : elle est (vraiment) beaucoup plus rapide à s'exécuter que in_array et elle permet d'éviter d'obtenir des doublons dans un tableau PHP. Bien entendu, si vous manipulez des tableaux assez légers (moins de 1000 entrées par tableau), la différence ne sera pas vraiment visible.

Dans le doute, je vous conseillerais donc d'utiliser isset, sauf si vous avez explicitement besoin de garder des doublons dans votre tableau.

Il est l'heure pour moi de retourner coder *part chasser des in_array*.