Cómo convertir cadenas a php booleano

318

¿Cómo puedo convertir una cadena boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

vuelve,

verdadero booleano

Pero debería ser boolean false.

laukok
fuente
¿Por qué alguien respondió sobre $ bool = !! $ string1?
zloctb
1
@zloctb porque no responde la pregunta. !!$string1devolvería un booleano indicativo de la cadena descrita en la respuesta mejor calificada.
David Barker

Respuestas:

347

Las cadenas siempre se evalúan como verdaderas booleanas a menos que tengan un valor que PHP considere "vacío" (tomado de la documentación deempty ):

  1. "" (una cadena vacía);
  2. "0" (0 como una cadena)

Si necesita establecer un valor booleano basado en el valor de texto de una cadena, deberá verificar la presencia o no de ese valor.

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

EDITAR: el código anterior está destinado a la claridad de la comprensión. En uso real, el siguiente código puede ser más apropiado:

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

o tal vez el uso de la filter_varfunción puede cubrir más valores booleanos:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varabarca toda una serie de valores, incluyendo los valores Truthy "true", "1", "yes"y "on". Ver aquí para más detalles.

GordonM
fuente
55
Recomiendo usar siempre una comparación estricta, si no está seguro de lo que está haciendo:$string === 'true'
Znarkus
248
Encontré esto, ¿ filter_var($string, FILTER_VALIDATE_BOOLEAN);es algo bueno?
laukok
10
El ternario no parece necesario. ¿Por qué no simplemente establecer $ test_mode_mail en el valor de la desigualdad? $ test_mode_mail = $ string === 'true'
Tim Banks
3
Pero, ¿qué pasa con 1/0, VERDADERO / FALSO? Creo que la respuesta de @lauthiamkok es la mejor.
ryabenko-pro
1
@FelipeTadeo Estoy hablando de cómo PHP evalúa las cadenas con respecto a las operaciones booleanas, nunca mencioné eval () y nunca recomendaría usarlo bajo ninguna circunstancia. PHP evaluará la cadena "(3 <5)" como verdadera booleana porque no está vacía.
GordonM
648

Este método fue publicado por @lauthiamkok en los comentarios. Lo publico aquí como respuesta para llamar más la atención.

Dependiendo de sus necesidades, debe considerar usar filter_var()con la FILTER_VALIDATE_BOOLEANbandera.

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
Puntilla
fuente
55
De acuerdo con la documentación, esta función está disponible para PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92
44
Realmente me gusta esta solución para configurar booleanos basados ​​en atributos de código abreviado de WordPress que tienen valores como verdadero, falso, encendido, 0, etc. Gran respuesta, definitivamente debería ser la respuesta aceptada.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)funcionó aún mejor para mí. Ver php.net/manual/en/function.filter-var.php#121263
Ryan
!! Nota IMPORTANTE !! filter_var devuelve también FALSE si falla el filtro. Esto puede crear algunos problemas.
AFA Med
35

La cadena "false" es considerada realmente un "TRUE"valor por PHP. La documentación dice:

Para convertir explícitamente un valor a booleano, use los moldes (bool) o (boolean). Sin embargo, en la mayoría de los casos la conversión es innecesaria, ya que un valor se convertirá automáticamente si un operador, función o estructura de control requiere un argumento booleano.

Ver también Tipo Malabares.

Al convertir a booleano, los siguientes valores se consideran FALSOS:

  • el booleano FALSO

  • el entero 0 (cero)

  • el flotador 0.0 (cero)

  • la cadena vacía y la cadena "0"

  • una matriz con cero elementos

  • un objeto con cero variables miembro (solo PHP 4)

  • el tipo especial NULL (incluidas las variables no definidas)

  • Objetos SimpleXML creados a partir de etiquetas vacías

Cualquier otro valor se considera VERDADERO (incluido cualquier recurso).

entonces si lo haces:

$bool = (boolean)"False";

o

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

En ambos casos $boolserá TRUE. Por lo tanto, debe hacerlo manualmente, como sugiere GordonM.

wosis
fuente
1
Euhm, por supuesto, el inferior devuelve falso. De hecho, arroja un error fatal :) "Error fatal: solo las variables se pueden pasar por referencia". $ a = 'Falso'; settype ($ a, 'boolean'); var_dump ($ a); de hecho volverá falso.
Rob
16

Al trabajar con JSON, tuve que enviar un valor booleano a través de $_POST. Tuve un problema similar cuando hice algo como:

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

En el código anterior, mi booleano se convirtió en una cadena JSON.

Para superar esto, puede decodificar la cadena usando json_decode():

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

(Esto normalmente debería funcionar con valores booleanos convertidos en cadena y enviados al servidor también por otros medios, es decir, que no sean JSON).

Nishanth Shaan
fuente
11

puedes usar json_decode para decodificar ese booleano

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
souparno majumder
fuente
json_decode también se transformará en entero si la cadena dada es un entero
Mihai Răducanu
1
Sí, eso es cierto, pero se menciona que la cadena tiene un valor booleano
souparno majumder
8
(boolean)json_decode(strtolower($string))

Maneja todas las variantes posibles de $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
mrded
fuente
¿Qué hay de ony off?
Cyclonecode
7

Si su variable "booleana" proviene de una matriz global como $ _POST y $ _GET, puede usar la filter_input()función de filtro.

Ejemplo para POST:

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

Si su variable "booleana" proviene de otra fuente, puede usar la filter_var()función de filtro.

Ejemplo:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
fuente
7

Puedes usar boolval($strValue)

Ejemplos:

<?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";
?>

Documentación http://php.net/manual/es/function.boolval.php

anayarojo
fuente
2
echo boolval('false');=> 1
Mubashar
Puede usar echo (int)'false;oecho intval('false');
anayarojo
@anayarojo (int)'true'y intval('true')ambos devuelven 0 también (todas las cadenas lo hacen)
sketchyTech
4

Lo más fácil de hacer es esto:

$str = 'TRUE';

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

var_dump($boolean);

Al hacerlo de esta manera, puede recorrer una serie de 'verdadero', 'VERDADERO', 'falso' o 'FALSO' y obtener el valor de la cadena a un valor booleano.

Brandon Sanders
fuente
3

Otras respuestas están por complicar las cosas. Esta pregunta es simplemente una pregunta lógica . Solo haz tu declaración correcta.

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

Ahora tu respuesta será

  • false, si la cadena era 'false',
  • o true, si tu cadena era 'true'.

Tengo que tener en cuenta que filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );aún será una mejor opción si necesita tener cadenas on/yes/1como alias para true.

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

o

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
Dmitry
fuente
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

Debes especificar

FILTER_NULL_ON_FAILURE
de lo contrario, siempre obtendrá falso incluso si $ string contiene algo más.

yoben
fuente
2

¡También puedes usar el método settype!

SetType ($ var, "Boolean") Echo $ var // ver 0 o 1

Nai
fuente
2

Lo hago de una manera que arrojará cualquier versión que no distinga entre mayúsculas y minúsculas de la cadena "false" al booleano FALSO, pero se comportará utilizando las reglas normales de conversión de php para todas las demás cadenas. Creo que esta es la mejor manera de prevenir comportamientos inesperados.

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

O como una función:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
Error de sintaxis
fuente
2

La respuesta de @GordonM es buena. Pero fallaría si $stringya es true(es decir, la cadena no es una cadena sino booleana VERDADERA) ... lo que parece ilógico.

Extendiendo su respuesta, usaría:

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

Me estaba confundiendo con los atributos de código abreviado de WordPress, decidí escribir una función personalizada para manejar todas las posibilidades. tal vez sea útil para alguien:

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
fuente
1
Estaba buscando ayuda en primer lugar, pero no encontré nada tan fácil como esperaba. Por eso escribí mi propia función. Sientase libre de usarlo.
tomi
-1

Una manera simple es verificar una serie de valores que considere verdaderos.

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

Editado para mostrar una posibilidad no mencionada aquí, porque mi respuesta original estaba lejos de estar relacionada con la pregunta del OP.

preg_match (); Es posible de usar. Sin embargo, en la mayoría de las aplicaciones será mucho más pesado de usar que otras respuestas aquí.

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)/iTambién se puede usar si es necesario en ciertas situaciones. No volverá correctamente cuando evalúa una cadena que contiene "falso" y "1".

JSG
fuente
Esto no es lo que se le pidió. La pregunta es cómo convertir una cadena en booleano.
mrded
mrded: leí mal la pregunta, me disculpo. Entonces, en buena forma espiritual, agregaré otra posibilidad que no se menciona aquí.
JSG
-1

En PHP, simplemente puede convertir un valor a booleano utilizando double not operator ( !!):

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
fuente
-4

Debería poder convertir a un booleano usando (bool) pero no estoy seguro sin verificar si esto funciona en las cadenas "verdadero" y "falso".

Sin embargo, esto podría valer un poco

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Vale la pena saber que lo siguiente evaluará el valor booleano False cuando se coloque dentro

if()
  • el booleano FALSO
  • el entero 0 (cero)
  • el flotador 0.0 (cero)
  • la cadena vacía y la cadena "0"
  • una matriz con cero elementos
  • un objeto con cero variables miembro (solo PHP 4)
  • el tipo especial NULL (incluidas las variables no definidas)
  • Objetos SimpleXML creados a partir de etiquetas vacías

Todo lo demás se evaluará como verdadero.

Como se describe aquí: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

dougajmcdonald
fuente
66
En respuesta a la suposición en su primer párrafo: el uso de una conversión explícita a booleana se convertirá "false"en true.
Mark Amery
2
Esto imprimirá "verdadero"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH Este
2
Esto es incorrecto, las cadenas se evalúan como verdaderas a menos que contengan "" o "0".
Michael J. Calkins