2011-01-23 14 views
89

Hoy estaba jugando con PHP, y descubrí que los valores de cadena "verdadero" y "falso" no se analizan correctamente en booleano en una condición, por ejemplo considerando la siguiente función:Analizando una cadena en un valor booleano en PHP

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 

Sólo parece funcionar con "1" y "0" valores:

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

¿Hay una función nativa en PHP para analizar cadenas "verdaderas" y "falsas" en booleano?

+0

En su código, 'isBoolean (" ")' debe devolver falso. – BoltClock

+0

@BoltClock actualizado, thx – Mark

+0

Debería considerar cambiar la respuesta aceptada por la respuesta de Eric Caron. Te muestra una función nativa que hace lo que pides. –

Respuesta

306

Hay un método PHP nativo de hacer esto, que utiliza el método filter_var de PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

de acuerdo con el manual de PHP:

devuelve true de "1", "verdadero", "sobre" y "y es ". Devuelve FALSO de lo contrario.

Si se establece FILTER_NULL_ON_FAILURE, FALSE se devuelve solo para "0", "falso", "apagado", "no" y "", y se devuelve NULL para todos los valores no booleanos.

+0

Esta debería haber sido la respuesta aceptada. Las funciones integradas de PHP son mejores que las tuyas propias. ¡No hay necesidad de reinventar la rueda! Lástima que ya era demasiado tarde: ¿P – casraf

+0

también minúscula el valor de la comparación? – Mobiletainment

+2

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

12

La razón es que todas las cadenas evalúan a true al convertirlas a boolean, excepto "0" y "" (cadena vacía).

La siguiente función va a hacer exactamente lo que quiere: se comporta exactamente como PHP, sino que 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:

  • la propia FALSO boolean
  • el número entero 0 (cero)
  • el flotador 0,0 (cero)
  • la cadena vacía, y la cadena "0"
  • una matriz con elementos cero
  • la NULL tipo especial (incluyendo variables no definidas)
  • objetos SimpleXML creados a partir de las etiquetas vacías

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

+1

+1 Agradable. (Podría arrojar un strtolower allí, pero eso es todo.) –

+0

Creo que middaparka significaba comparar strtolower ($ value) con 'false'. Pasar literalmente 'falso' a strtolower es un poco ... tonto? :) –

+0

@Paul Dixon Yup, eso es a lo que me refería. :-) –

4

En PHP solo "0" o la cadena vacía forzar a falso; cada otra cadena no vacía coerces a verdadero. Desde el manual:

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

tiene que escribir:

Al convertir a booleano, los siguientes valores se consideran FALSE su propia función para manejar las cadenas "true" vs "false".Aquí, supongo que todo defecto más que falsa:

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

En una nota que podría ser fácilmente condensa a

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

¿Hay una función en PHP para analizar "verdadero" y "falso "cadenas en boolean?

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

Debería probar esto manualmente. Sin embargo, si es posible, sería mejor trabajar con valores booleanos "reales".

+1

No todas las cadenas evalúan 'verdadero' en PHP. – coreyward

+1

No estaba corrigiendo, simplemente aclarando. Decir "ambos son cadenas [y evaluar a 'verdadero']" podría dar una impresión equivocada a un novato, especialmente uno de otro idioma con reglas de tipeo más estrictas donde una cadena es una cadena y el contenido no importa cuando se convierte a booleano (como Ruby). – coreyward

+1

@corey es suficiente, buen punto. Aclararé en el texto –

3

estoy usando esta construcción de transformarse cadenas en booleanos, ya que desea true para la mayoría de otros valores:

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

Hace poco necesitaba una función de conversión booleana "suelta" para manejar cadenas como las que pregunta (entre otras cosas). I found a few different approaches and came up with a big set of test data to run through them. Nada encaja en mis necesidades así que escribí mi propia:

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 contable y cuerdas moldeable, esto favorecerá la cuenta sobre el valor de cadena para determinar truthiness. Es decir, si $object instanceof Countable esto devolverá (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 here. Es un poco difícil analizar los resultados de ese pequeño iframe, por lo que puede view the script output in a full page, en su lugar (esa URL no está documentada, por lo que es posible que esto no funcione para siempre). En caso de que esos enlaces mueran algún día, I put the code up on pastebin también.

La línea entre lo que "debería ser cierto" y lo que no debería ser bastante arbitrario; los datos que utilicé se clasifican en función de mis necesidades y preferencias estéticas, las tuyas pueden diferir.

0

La forma más fácil de convertir de forma segura a un 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' 
Cuestiones relacionadas