最近,我需要一个“松散”布尔转换函数来处理类似您所要求的字符串(以及其他事项)。 我找到了几种不同的方法,并提出了大量的测试数据来运行它们。没有什么适合我的需求的,所以我写了自己的:
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;
}
}
请注意,对于可计数和可字符串转换的对象,这将有利于计数而不是字符串值来确定真实性。也就是说,无论的值是否,$object instanceof Countable
它都会返回。(boolean) count($object)
(string) $object
您可以在此处查看我使用的测试数据的行为以及其他几个函数的结果。很难从那小幅iframe中浏览结果,因此您可以在整页中查看脚本输出(该URL没有文档说明,因此可能永远无法使用)。万一有一天这些链接消失了,我也将代码放在pastebin上。
在“应该是真实的”和“不应该是真实的”之间的界限相当随意。我使用的数据是根据我的需求和审美偏好进行分类的,您的可能会有所不同。
isBoolean("")
应返回false。