collection

Best Practice : Tester la présence d'une valeur dans un tableau

Comment devenir plus rapide que le in_array

tester presence d valeur dans un tableau, tester tableau en php

Date de publication : 2008-12-07

Bien sur en php tout le monde utilise la fonction in_array pour savoir si un élément est présent dans un tableau.

Cependant il existe une astuce qui permet de trouver rapidement un élément du tableau.

En effet, la fonction in_array à l'inconvénient de parcourir le tableau pour trouver si l'élément existe. C'est alors que m'est venu l'idée d'utiliser les index du tableau pour tester directement l'existence de la valeur plutôt que d'utiliser l'accès séquentiel de in_array.


Petit exemple :


$arrIndex = array('1'=>true,'2'=>true,'3'=>true,'4'=>true);
$arr = array('1','2','3','4');
$start = time()+microtime();
for ($i=0;$i<10000;$i++)
{
isset($arrIndex['1']);
}
var_dump(time()+microtime()-$start);
$start = time()+microtime();
for ($i=0;$i<10000;$i++)
{
in_array('1',$arr);
}
var_dump(time()+microtime()-$start);

Résultat du benchmark :


0.009213924407959 secondes pour le isset
0.15566611289978 secondes pour le in_array

Cette astuce peut être utiliser pour tester les valeurs issues d'un formulaire. Dans l'exemple suivant on suppose que l'on demande à l'utilisateur son fruit favori.
Voici le code utilisant l'astuce du isset permettant de vérifier si le fruit récu est valide :


$fruits = array('pomme','poire','banane','ananas');
$fruitFavori = isset($_GET['fruit']) && isset($fruits[$_GET['fruit']] ? $_GET['fruit'] : false;

La variable $fruitFavori vaut le fruit si le paramètre GET vaut un fruit de notre liste et false sinon.

Remarques :

La fonction array_flip vous permet d'inverser les valeurs et les clés du tableau afin de transformer votre tableau pour utiliser le test avec isset.

Cette astuce ne convient pas à tous les tableaux, vous noterez que le tableau arrIndex est spécial.

N'utilisez pas cette astuce si la transformation de votre tableau nécessite plus de temps d'exécution que le test.

Isset est plus rapide que array_key_exist mais ne se comporte pas de la même manière sur des tableaux ayant des valeurs null.

 
 

b1n@sp1n