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
Parece que solo funciona 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?
isBoolean("")
debe devolver falso.true
aunque, para un lector humano, parezca más intuitivo de lo que significabaFALSE
.Respuestas:
Hay un método PHP nativo para hacer esto que usa el método filter_var de PHP:
De acuerdo con el manual de PHP :
fuente
FILTER_NULL_ON_FAILURE
a lafilter_var()
función y NO reemplazarlaFILTER_VALIDATE_BOOLEAN
como pensé. Esto dará como resultado el siguiente código que hizo el truco para mí:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
La razón es que todas las cadenas se evalúan
true
cuando se convierten en booleanas, excepto"0"
y""
(cadena vacía).La siguiente función hará exactamente lo que desea: se comporta exactamente como PHP, pero también evalúa la cadena
"false"
comofalse
:La documentación explica que: http://php.net/manual/en/language.types.boolean.php :
fuente
Solo en PHP
"0"
o la cadena vacía coacciona a falso; cualquier otra cadena no vacía coacciona a verdadero. Del manual :Usted tiene que escribir su propia función para manejar las cuerdas
"true"
vs"false"
. Aquí, supongo que todo lo demás por defecto es falso:En una nota al margen que fácilmente podría condensarse en
fuente
Hace poco necesitaba 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 ajusta a mis necesidades, así que escribí el mío:
Tenga en cuenta que para los objetos que son contables y moldeables en cadena, esto favorecerá el recuento 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 leer los resultados de ese pequeño iframe, por lo que puede ver la salida del script en una página completa (esa URL no está documentada, por lo que esto podría no funcionar para siempre). En caso de que esos enlaces desaparezcan algún día, también pongo el código en pastebin .
La línea entre lo que "debería ser cierto" y lo que no debería es bastante arbitraria; Los datos que utilicé se clasifican en función de mis necesidades y preferencias estéticas, las suyas pueden diferir.
fuente
Estoy usando esta construcción para transformar cadenas en booleanos, ya que desea
true
para la mayoría de los otros valores:fuente
No, ambas son cadenas y ambas (como usted dice) evalúan
true
. Solo las cadenas vacías se evalúanfalse
en PHP.Tendría que probar esto manualmente. Sin embargo, si es posible, sería mejor trabajar con valores booleanos "reales".
fuente
true
en PHP.true
]" podría dar a un novato la impresión equivocada, especialmente una de otro idioma con reglas de escritura más estrictas donde una cadena es una cadena y el contenido no importa cuando se convierte en un booleano (como Rubí)."0"
? ¿No se evalúa esto tambiénfalse
?La forma más fácil de convertir de forma segura a un booleano;
fuente
Si su API solo acepta las cadenas "verdadero" o "falso", con todo lo demás
null
, intente:Esto supone que
$input
no es un objeto. Null coalesce (??
) se introdujo en PHP 7.0.fuente