Analizando una cadena en un valor booleano en PHP

6 minutos de lectura

avatar de usuario
Marca

Hoy estaba jugando con PHP y descubrí que los valores de cadena “verdadero” y “falso” no se analizan correctamente como booleanos en una condición, por ejemplo, considerando la siguiente función:

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

Si ejecuto:

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

Solo parece funcionar con valores “1” y “0”:

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

¿Existe una función nativa en PHP para analizar cadenas “verdaderas” y “falsas” en booleanas?

  • En tu código, isBoolean("") debe devolver falso.

    – BoltClock

    23 de enero de 2011 a las 17:47

  • PHP no pensar sobre lo que dice la cadena, “falso” son solo cinco caracteres que no significan nada. Están alguna cosa sin embargo, por lo que el valor booleano se evalúa como true aunque para un lector humano, parecería más intuitivo que significaba FALSE.

    – entusiasmo

    30 de agosto de 2016 a las 17:26

avatar de usuario
eric caron

Hay un método PHP nativo para hacer esto que usa el método filter_var de PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

De acuerdo a manual de PHP:

Devuelve VERDADERO para “1”, “verdadero”, “encendido” y “sí”. Devuelve FALSO en caso contrario.

Si se establece FILTER_NULL_ON_FAILURE, se devuelve FALSE solo para “0”, “false”, “off”, “no” y “”, y se devuelve NULL para todos los valores no booleanos.

  • ¿También pone en minúsculas el valor de la comparación?

    – Entretenimiento móvil

    9 de noviembre de 2013 a las 19:23

  • @Mobiletainment, sí, maneja cualquier carcasa que pueda imaginar por valor de $ (falso, FALSO, Falso, etc.)

    –Eric Caron

    12 de noviembre de 2013 a las 21:11

  • Testcase Borked en mi extremo. Usado == en lugar de === para comparar. Eliminaré mi comentario anterior para no confundir a la gente.

    – andig

    30 de diciembre de 2015 a las 10:01

  • Nunca he visto esto antes. Excelente solución.

    – Patricio

    3 de junio de 2016 a las 14:03

  • La respuesta me tomó desprevenido porque hay que agregar la bandera FILTER_NULL_ON_FAILURE hacia filter_var() función y NO reemplazarlo con FILTER_VALIDATE_BOOLEAN como yo pensaba. Esto dará como resultado el siguiente código que funcionó para mí: $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)

    – Dragón54

    23 de marzo de 2017 a las 10:17


avatar de usuario
Arnaud LeBlanc

La razón es que todas las cadenas se evalúan como true al convertirlos a booleanos, excepto "0" y "" (cuerda vacía).

La siguiente función hará exactamente lo que desea: se comporta exactamente como PHP, pero también evalúa la cadena "false" como false:

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

La documentación explica que: http://php.net/manual/en/language.types.boolean.php :

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

  • el propio booleano FALSO
  • el entero 0 (cero)
  • el flotador 0.0 (cero)
  • la cadena vacía, y la cadena “0”
  • una matriz con cero elementos
  • el tipo especial NULL (incluidas las variables no establecidas)
  • Objetos SimpleXML creados a partir de etiquetas vacías

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

  • @Marco – if ($value && strtolower($value) !== “faux”) { si está trabajando en francés; if ($valor && strtolower($valor) !== “falsch”) { en alemán; if ($value && strtolower($value) !== “onwaar”) { en holandés… puedes entender por qué PHP no tiene esto incorporado como estándar

    – Marcos Baker

    23 de enero de 2011 a las 17:58


  • “todos no vacío las cadenas se evalúan como verdaderas al convertirlas a booleanas, excepto “0”.”

    – BoltClock

    23 de enero de 2011 a las 18:08

avatar de usuario
PernoReloj

Solo en PHP "0" o la cadena vacía coacciona a falso; todas las demás cadenas no vacías se convierten en verdaderas. Desde el manual:

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

  • la cadena vacía y la cadena “0”

Necesita escribir su propia función para manejar las cadenas "true" contra "false". Aquí, asumo que todo lo demás por defecto es falso:

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

En una nota al margen que podría resumirse fácilmente en

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

Recientemente necesité una función de conversión booleana “suelta” para manejar cadenas como las que está preguntando (entre otras cosas). Encontré algunos enfoques diferentes y se me ocurrió un gran conjunto de datos de prueba para ejecutarlos.. Nada se ajustaba a mis necesidades, así que escribí las mías propias:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value="";
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

Tenga en cuenta que para los objetos que son tanto contables como de cadena, esto favorecerá el conteo sobre el valor de la cadena para determinar la veracidad. es decir, si $object instanceof Countable esto regresará (boolean) count($object) independientemente del valor de (string) $object.

Puede ver el comportamiento de los datos de prueba que utilicé, así como los resultados de varias otras funciones. aquí. Es un poco difícil hojear los resultados de ese pequeño iframe, por lo que puede ver la salida del script en una página completa, en cambio (esa URL no está documentada, por lo que es posible que no funcione para siempre). En caso de que esos enlaces mueran algún día, Puse el código en pastebin también.

La línea entre lo que “debe ser verdad” y lo que no es bastante arbitraria; Los datos que utilicé se clasifican según mis necesidades y preferencias estéticas, las tuyas pueden diferir.

Estoy usando esta construcción para transformar cadenas en booleanos, ya que quieres true para la mayoría de los otros valores:

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

¿Existe una función en PHP para analizar cadenas “verdaderas” y “falsas” en booleanas?

No, ambas son cadenas, y ambas (como usted dice) se evalúan como true. Solo las cadenas vacías se evalúan como false en PHP.

Tendría que probar esto manualmente. Sin embargo, si es posible, sería mejor trabajar con valores booleanos “reales”.

avatar de usuario
Timoteo Pérez

La forma más fácil de convertir de forma segura a un valor booleano;

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad