Comment convertir une chaîne en php booléen

318

Comment puis-je convertir une chaîne en boolean?

$string = 'false';

$test_mode_mail = settype($string, 'boolean');

var_dump($test_mode_mail);

if($test_mode_mail) echo 'test mode is on.';

il revient,

booléen vrai

mais ça devrait l'être boolean false.

laukok
la source
Pourquoi a-t-on répondu à propos de $ bool = !! $ string1?
zloctb
1
@zloctb car il ne répond pas à la question. !!$string1retournerait un booléen indicatif de la chaîne décrite dans la réponse la mieux notée.
David Barker

Réponses:

347

Les chaînes sont toujours évaluées comme booléennes true, sauf si elles ont une valeur considérée comme "vide" par PHP (tirée de la documentation deempty ):

  1. "" (une chaîne vide);
  2. "0" (0 sous forme de chaîne)

Si vous devez définir un booléen en fonction de la valeur de texte d'une chaîne, vous devrez vérifier la présence ou non de cette valeur.

$test_mode_mail = $string === 'true'? true: false;

EDIT: le code ci-dessus est destiné à la clarté de la compréhension. En utilisation réelle, le code suivant peut être plus approprié:

$test_mode_mail = ($string === 'true');

ou peut-être que l'utilisation de la filter_varfonction peut couvrir des valeurs plus booléennes:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varcouvre toute une gamme de valeurs, y compris les valeurs de truthy "true", "1", "yes"et "on". Voir ici pour plus de détails.

GordonM
la source
5
Je recommande de toujours utiliser une comparaison stricte, si vous n'êtes pas sûr de ce que vous faites:$string === 'true'
Znarkus
248
J'ai trouvé ça - filter_var($string, FILTER_VALIDATE_BOOLEAN);est-ce une bonne chose?
laukok
10
Le ternaire ne semble pas nécessaire. Pourquoi ne pas simplement définir $ test_mode_mail sur la valeur de l'inégalité? $ test_mode_mail = $ string === 'true'
Tim Banks
3
Mais qu'en est-il de 1/0, TRUE / FALSE? Je pense que la réponse de @authiamkok est la meilleure.
ryabenko-pro
1
@FelipeTadeo Je parle de la façon dont PHP évalue les chaînes par rapport aux opérations booléennes, je n'ai jamais mentionné eval () et je ne recommanderais jamais de l'utiliser en aucune circonstance. La chaîne "(3 <5)" sera évaluée par PHP comme booléenne true car elle n'est pas vide.
GordonM
648

Cette méthode a été publiée par @lauthiamkok dans les commentaires. Je le poste ici comme réponse pour attirer plus d'attention.

Selon vos besoins, vous devriez envisager d'utiliser filter_var()avec le FILTER_VALIDATE_BOOLEANdrapeau.

filter_var(    true, FILTER_VALIDATE_BOOLEAN); // true
filter_var(    'true', FILTER_VALIDATE_BOOLEAN); // true
filter_var(         1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(       '1', FILTER_VALIDATE_BOOLEAN); // true
filter_var(      'on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(     'yes', FILTER_VALIDATE_BOOLEAN); // true

filter_var(   false, FILTER_VALIDATE_BOOLEAN); // false
filter_var(   'false', FILTER_VALIDATE_BOOLEAN); // false
filter_var(         0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(       '0', FILTER_VALIDATE_BOOLEAN); // false
filter_var(     'off', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      'no', FILTER_VALIDATE_BOOLEAN); // false
filter_var('asdfasdf', FILTER_VALIDATE_BOOLEAN); // false
filter_var(        '', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      null, FILTER_VALIDATE_BOOLEAN); // false
Brad
la source
5
Selon la documentation, cette fonction est disponible pour PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92
4
J'aime vraiment cette solution pour définir des booléens basés sur des attributs de shortcode WordPress qui ont des valeurs telles que true, false, on, 0, etc. Une bonne réponse, devrait certainement être la réponse acceptée.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)a fonctionné encore mieux pour moi. Voir php.net/manual/en/function.filter-var.php#121263
Ryan
!! Note importante !! filter_var renvoie également FALSE si le filtre échoue. Cela peut créer des problèmes.
AFA Med du
35

La chaîne "false" est en fait considérée comme une "TRUE"valeur par PHP. La documentation dit:

Pour convertir explicitement une valeur en booléen, utilisez les transtypages (bool) ou (booléen). Cependant, dans la plupart des cas, la conversion n'est pas nécessaire, car une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle nécessite un argument booléen.

Voir aussi Jonglage de type.

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

  • le booléen FAUX lui-même

  • l'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éments

  • un objet avec zéro variable membre (PHP 4 uniquement)

  • 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).

donc si vous le faites:

$bool = (boolean)"False";

ou

$test = "false";
$bool = settype($test, 'boolean');

dans les deux cas $boolsera TRUE. Vous devez donc le faire manuellement, comme le suggère GordonM.

wosis
la source
1
Euhm, bien sûr l'inférieur renvoie faux. En fait, cela lance un fatal :) "Erreur fatale: seules les variables peuvent être passées par référence". $ a = 'False'; settype ($ a, 'booléen'); var_dump ($ a); retournera en effet faux.
Rob
16

Lorsque je travaillais avec JSON, je devais envoyer une valeur booléenne via $_POST. J'ai eu un problème similaire lorsque j'ai fait quelque chose comme:

if ( $_POST['myVar'] == true) {
    // do stuff;
}

Dans le code ci-dessus, mon booléen a été converti en une chaîne JSON.

Pour surmonter cela, vous pouvez décoder la chaîne en utilisant json_decode():

//assume that : $_POST['myVar'] = 'true';
 if( json_decode('true') == true ) { //do your stuff; }

(Cela devrait normalement fonctionner avec des valeurs booléennes converties en chaîne et envoyées au serveur également par d'autres moyens, c'est-à-dire autrement qu'en utilisant JSON.)

Nishanth Shaan
la source
11

vous pouvez utiliser json_decode pour décoder ce booléen

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
souparno majumder
la source
json_decode se transformera également en entier si la chaîne donnée est un entier
Mihai Răducanu
1
Oui, c'est vrai, mais il est mentionné que la chaîne détient une valeur booléenne
souparno majumder
8
(boolean)json_decode(strtolower($string))

Il gère toutes les variantes possibles de $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
mrded
la source
Et pour onet off?
Cyclonecode
7

Si votre variable "booléenne" provient d'un tableau global tel que $ _POST et $ _GET, vous pouvez utiliser la filter_input()fonction de filtre.

Exemple pour POST:

$isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);

Si votre variable "booléenne" provient d'une autre source, vous pouvez utiliser la filter_var()fonction de filtrage.

Exemple:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
la source
7

Vous pouvez utiliser boolval($strValue)

Exemples:

<?php
echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

Documentation http://php.net/manual/es/function.boolval.php

anayarojo
la source
2
echo boolval('false');=> 1
Mubashar
Vous pouvez utiliser echo (int)'false;ouecho intval('false');
anayarojo
@anayarojo (int)'true'et les intval('true')deux renvoient également 0 (toutes les chaînes le font)
sketchyTech
4

la chose la plus simple à faire est la suivante:

$str = 'TRUE';

$boolean = strtolower($str) == 'true' ? true : false;

var_dump($boolean);

En procédant de cette façon, vous pouvez parcourir une série de «true», «TRUE», «false» ou «FALSE» et obtenir la valeur de chaîne à un booléen.

Brandon Sanders
la source
3

D'autres réponses viennent compliquer les choses. Cette question est simplement une question de logique . Obtenez juste votre déclaration.

$boolString = 'false';
$result = 'true' === $boolString;

Maintenant, votre réponse sera soit

  • false, si la chaîne était 'false',
  • ou true, si votre chaîne l'était 'true'.

Je dois noter que ce filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );sera toujours une meilleure option si vous avez besoin d'avoir des chaînes comme on/yes/1alias true.

kaiser
la source
3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

ou

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
Dmitry
la source
3
filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

$string = 1; // true
$string ='1'; // true
$string = 'true'; // true
$string = 'trUe'; // true
$string = 'TRUE'; // true
$string = 0; // false
$string = '0'; // false
$string = 'false'; // false
$string = 'False'; // false
$string = 'FALSE'; // false
$string = 'sgffgfdg'; // null

Vous devez spécifier

FILTER_NULL_ON_FAILURE
sinon, vous obtiendrez toujours false même si $ string contient autre chose.

yoben
la source
2

Vous pouvez également utiliser la méthode settype!

SetType ($ var, "Boolean") Echo $ var // voir 0 ou 1

Nai
la source
2

Je le fais d'une manière qui convertira toute version insensible à la casse de la chaîne "false" au booléen FALSE, mais se comportera en utilisant les règles de casting php normales pour toutes les autres chaînes. Je pense que c'est la meilleure façon de prévenir un comportement inattendu.

$test_var = 'False';
$test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
$result = (boolean) $test_var;

Ou en fonction:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
Erreur de syntaxe
la source
2

La réponse de @GordonM est bonne. Mais il échouerait si le $stringest déjà true(c'est-à-dire que la chaîne n'est pas une chaîne mais booléenne VRAI) ... ce qui semble illogique.

Prolongeant sa réponse, j'utiliserais:

$test_mode_mail = ($string === 'true' OR $string === true));
Ema4rl
la source
0

J'étais confus avec les attributs de shortcode wordpress, j'ai décidé d'écrire une fonction personnalisée pour gérer toutes les possibilités. c'est peut-être utile pour quelqu'un:

function stringToBool($str){
    if($str === 'true' || $str === 'TRUE' || $str === 'True' || $str === 'on' || $str === 'On' || $str === 'ON'){
        $str = true;
    }else{
        $str = false;
    }
    return $str;
}
stringToBool($atts['onOrNot']);
tomi
la source
1
je cherchais de l'aide en premier lieu, mais je n'ai rien trouvé d'aussi facile que je l'espérais. c'est pourquoi j'ai écrit ma propre fonction. Sentez-vous libre de l'utiliser.
tomi
-1

Un moyen simple consiste à comparer avec un tableau de valeurs que vous considérez comme vraies.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
Tajin
la source
-1

Modifié pour montrer une possibilité non mentionnée ici, car ma réponse d'origine était loin d'être liée à la question du PO.

preg_match (); Est possible d'utiliser. Cependant, dans la plupart des applications, il sera beaucoup plus lourd à utiliser que les autres réponses ici.

if (preg_match("/true/i", "true PHP is a web scripting language of choice.")) {
    echo "<br><br>Returned true";
} else {
    echo "<br><br>Returned False";
}

/(?:true)|(?:1)/iPeut également être utilisé si nécessaire dans certaines situations. Il ne retournera pas correctement lorsqu'il évalue une chaîne contenant à la fois "false" et "1".

JSG
la source
Ce n'est pas ce qui a été demandé. La question est de savoir comment convertir une chaîne en booléen.
mrded
mrded: J'ai mal lu la question, je m'excuse. Donc, dans un bon esprit, j'ajouterai une autre possibilité non mentionnée ici.
JSG
-1

En PHP, vous pouvez simplement convertir une valeur en booléen en utilisant l' opérateur double not ( !!):

var_dump(!! true);     // true
var_dump(!! "Hello");  // true
var_dump(!! 1);        // true
var_dump(!! [1, 2]);   // true
var_dump(!! false);    // false
var_dump(!! null);     // false
var_dump(!! []);       // false
var_dump(!! 0);        // false
var_dump(!! '');       // false
AliN11
la source
-4

Vous devriez pouvoir effectuer un cast vers un booléen en utilisant (bool) mais je ne suis pas sûr sans vérifier si cela fonctionne sur les chaînes "true" et "false".

Cela pourrait cependant valoir le coup

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Il vaut la peine de savoir que ce qui suit évaluera le booléen Faux lorsqu'il est mis à l'intérieur

if()
  • le booléen FAUX lui-même
  • l'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éments
  • un objet avec zéro variable membre (PHP 4 uniquement)
  • le type spécial NULL (y compris les variables non définies)
  • Objets SimpleXML créés à partir de balises vides

Tout le reste sera évalué comme vrai.

Comme décrit ici: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

dougajmcdonald
la source
6
En réponse à la supposition de votre premier paragraphe: utiliser une conversion explicite en booléen se convertira "false"en true.
Mark Amery
2
Ceci sera imprimé "vrai"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH Ce
2
C'est faux, les chaînes sont évaluées comme vraies sauf si elles contiennent "" ou "0".
Michael J.Calkins