in_array et true sont dans un bateau

in_array tombe à l'eau. Laissez le se noyer. Petit test :

$array = array('apple' => true, 'lemon' => 123, 'strawberry' => 'foo');
var_dump(in_array(256, $array));

Quel est le résultat ?

bool(true)

En fait comme in_array utilise par défaut une comparaison souple pour sa recherche, le fait que le tableau comporte la valeur true fait qu'automatiquement tous les entiers différents de zéro sont considérés comme faisant partie du tableau. En effet :

> var_dump(256 == true);
bool(true)

Et comme le tableau contient une chaîne de caractères qui ne correspond pas à un nombre, cette dernière est convertie en zéro lorsqu'elle est comparée à l'entier recherché :

> var_dump(0 == 'foo');
bool(true)

Donc :

> var_dump(in_array(0, $array));
bool(true)

Oh et puis bien sur toutes les chaînes de caractères non vides sont trouvées également puisqu'elles sont comparées avec true...

Génial non ? En fait avec in_array, il est préférable de toujours passer true dans le 3ème argument pour utiliser une comparaison stricte sinon vous êtes sur de vous faire avoir. Il est presque impossible de prédire le résultat de cette fonction si on ne connait pas par cœur les règles de la comparaison souple de PHP.

Etiquettes:

Add new comment