parse - php boolean val
Analizando una cadena en un valor booleano en PHP (7)
¿Hay una función en PHP para analizar cadenas "verdaderas" y "falsas" en booleano?
No, ambos son cadenas, y esos dos (como dices) se evalúan como true
. Solo las cadenas vacías se evalúan como false
en PHP.
Debería probar esto manualmente. Sin embargo, si es posible, sería mejor trabajar con valores booleanos "reales".
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 teniendo en cuenta 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 los valores "1" y "0":
isBoolean("1") // Returns true
isBoolean("0") // Returns false
¿Hay una función nativa en PHP para analizar cadenas "verdaderas" y "falsas" en booleano?
En PHP, solo "0"
o la cadena vacía forzar a falso; cada otra cadena no vacía coerces a verdadero. Del http://php.net/manual/en/language.types.boolean.php :
Al convertir a booleano, los siguientes valores se consideran
FALSE
:
- la cadena vacía y la cadena "0"
Necesita escribir su propia función para manejar las cadenas "true"
y "false"
. Aquí, supongo que todo lo demás está predeterminado en falso:
function isBoolean($value) {
if ($value === "true") {
return true;
} else {
return false;
}
}
En una nota lateral que podría condensarse fácilmente
function isBoolean($value) {
return $value === "true";
}
Estoy usando esta construcción para transformar cadenas en booleanos, ya que quieres que sean true
para la mayoría de los otros valores:
$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
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 con el manual de PHP:
Devuelve VERDADERO para "1", "verdadero", "encendido" y "sí". 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.
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''
La razón es que todas las cadenas se evalúan como true
al convertirlas a boolean, excepto "0"
y ""
(cadena vacía).
La siguiente función hará exactamente lo que usted 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 FALSOS:
- el booleano FALSE en sí mismo
- 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 ajustadas)
- Objetos SimpleXML creados a partir de etiquetas vacías
Cualquier otro valor se considera VERDADERO (incluido cualquier recurso).
Recientemente necesité una función de conversión booleana "suelta" para manejar cadenas como las que preguntas (entre otras cosas). Encontré algunos enfoques diferentes y obtuve un gran conjunto de datos de prueba para analizarlos . Nada encajaba en mis necesidades, así que escribí el mío:
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 contables y que pueden convertirse en hebras, esto favorecerá la cuenta sobre el valor de la cadena para determinar la veracidad. 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 otras funciones aquí . Es bastante difícil analizar los resultados de ese pequeño iframe, por lo que puede ver el resultado del script en una página completa , en su lugar (esa URL no está documentada, por lo que podría no funcionar para siempre). En caso de que esos enlaces mueran algún día, también coloque el código en pastebin .
La línea entre lo que "debería ser cierto" y lo que no debería ser es bastante arbitraria; los datos que utilicé se clasifican en función de mis necesidades y preferencias estéticas, las tuyas pueden diferir.