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:
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 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.
isBoolean("")
debe devolver falso.