138 votes

Analyse d'une chaîne de caractères en une valeur booléenne en PHP

Aujourd'hui, en jouant avec PHP, j'ai découvert que les valeurs "true" et "false" ne sont pas correctement converties en booléens dans une condition, par exemple dans la fonction suivante :

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

Si j'exécute :

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

Il ne semble fonctionner qu'avec les valeurs "1" et "0" :

isBoolean("1") // Returns true
isBoolean("0") // Returns false

Existe-t-il une fonction native en PHP pour analyser les chaînes "true" et "false" en booléens ?

0 votes

Dans votre code, isBoolean("") devrait retourner false.

0 votes

Vous devriez envisager de changer la réponse acceptée par celle d'Eric Caron. Il vous montre une fonction native qui fait ce que vous demandez.

1 votes

PHP n'a pas pensez à à propos de ce que dit la chaîne, "faux" est juste cinq caractères qui ne veulent rien dire. Ils sont quelque chose cependant, la valeur booléenne est évaluée à true même si pour un lecteur humain, il semblerait plus intuitif que cela signifie FALSE .

435voto

Eric Caron Points 1797

Il existe une méthode PHP native pour faire cela, qui utilise la méthode filter_var de PHP :

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

Selon Manuel de PHP :

Renvoie VRAI pour "1", "vrai", "on" et "oui". Sinon, elle renvoie FALSE.

Si FILTER_NULL_ON_FAILURE est défini, FALSE est renvoyé uniquement pour "0", "false", "off", "no" et "", et NULL est renvoyé pour toutes les valeurs non booléennes.

0 votes

Cela aurait dû être la réponse acceptée. Les fonctions PHP intégrées sont préférables à la création des vôtres. Pas besoin de réinventer la roue ! Dommage que ce soit trop tard :P

1 votes

Est-ce que la valeur de la comparaison est également mise en minuscule ?

3 votes

@Mobiletainment, oui - il gère tous les cas que vous pouvez imaginer pour $value (false, FALSE, FalSe, etc.).

14voto

arnaud576875 Points 35281

La raison en est que toutes les chaînes de caractères sont évaluées à true lors de leur conversion en booléen, à l'exception de "0" y "" (chaîne vide).

La fonction suivante fera exactement ce que vous voulez : elle se comporte exactement comme PHP, mais elle évalue également la chaîne de caractères "false" como false :

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

La documentation explique cela : http://php.net/manual/en/language.types.boolean.php :

Lors de la conversion en booléen, les valeurs suivantes sont considérées comme FAUX :

  • le booléen FALSE lui-même
  • le nombre entier 0 (zéro)
  • le flotteur 0.0 (zéro)
  • la chaîne vide, et la chaîne "0"
  • un tableau avec zéro élément
  • le type spécial NULL (y compris les variables non définies)
  • Objets SimpleXML créés à partir de balises vides

Toute autre valeur est considérée comme VRAIE (y compris toute ressource).

2 votes

+1 Nice. (On pourrait y ajouter un strtolower, mais c'est à peu près tout).

0 votes

Je pense que middaparka voulait dire comparer strtolower($value) avec 'false'. Passer un 'false' littéral dans strtolower est un peu....daft ? :)

0 votes

@Paul Dixon Oui, c'est à cela que je faisais référence :-)

5voto

BoltClock Points 249668

En PHP uniquement "0" ou la chaîne vide coïncident avec false ; toute autre chaîne non vide coïncide avec true. De la manuel :

Lors de la conversion en booléen, les valeurs suivantes sont prises en compte FALSE :

  • la chaîne vide, et la chaîne "0".

Vous devez écrire votre propre fonction pour gérer les chaînes de caractères. "true" vs "false" . Ici, je suppose que tout le reste est par défaut à false :

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

D'ailleurs, cela pourrait facilement se résumer à

function isBoolean($value) {
   return $value === "true";
}

3voto

mario Points 76989

J'utilise cette construction pour transformer des chaînes en booléens, puisque vous voulez true pour la plupart des autres valeurs :

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

1voto

Pekka 웃 Points 249607

Existe-t-il une fonction en PHP pour analyser les chaînes "true" et "false" en booléens ?

Non - les deux sont des chaînes de caractères, et les deux (comme vous le dites) évaluent à true . Seules les chaînes de caractères vides sont évaluées par false en PHP.

Vous devez effectuer ce test manuellement. Toutefois, dans la mesure du possible, il est préférable de travailler avec de "vraies" valeurs booléennes.

1 votes

Toutes les chaînes de caractères ne sont pas évaluées par true en PHP.

1 votes

Je ne corrigeais pas, je clarifiais juste. Dire "les deux sont des chaînes de caractères [et évaluent à true ]" pourrait donner une mauvaise impression à un débutant, surtout s'il vient d'un autre langage avec des règles de typage plus strictes où une chaîne est une chaîne et où le contenu n'a pas d'importance lorsqu'elle est convertie en booléen (comme Ruby).

1 votes

"Seules les chaînes vides sont évaluées à false en PHP." Mais qu'en est-il de la chaîne non vide "0" ? Cela ne revient-il pas à false ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X