今天我正在玩PHP,我发现字符串值“true”和“false”在条件中没有被正确解析为boolean,例如考虑以下函数:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
如果我执行:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
它似乎只能使用“1”和“0”值:
isBoolean("1") // Returns true
isBoolean("0") // Returns false
PHP中是否有一个本机函数可以将“true”和“false”字符串解析为boolean?
答案 0 :(得分:372)
有一种本机PHP方法,它使用PHP的filter_var方法:
$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);
根据PHP's manual:
为“1”,“true”,“on”和“yes”返回TRUE。否则返回FALSE。
如果设置了FILTER_NULL_ON_FAILURE,则仅为“0”,“false”,“off”,“no”和“”返回FALSE,并为所有非布尔值返回NULL。
答案 1 :(得分:14)
原因是所有字符串在将它们转换为布尔值时都会计算为true
,但"0"
和""
除外(空字符串)。
以下函数将完全按照您的要求执行:它的行为与PHP完全相同,但也会将字符串"false"
评估为false
:
function isBoolean($value) {
if ($value && strtolower($value) !== "false") {
return true;
} else {
return false;
}
}
文档解释说:http://php.net/manual/en/language.types.boolean.php:
转换为布尔值时,以下值被视为FALSE:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空字符串,字符串“0”
- 包含零元素的数组
- 特殊类型NULL(包括未设置的变量)
- 从空标签创建的SimpleXML对象
其他每个值都被视为TRUE(包括任何资源)。
答案 2 :(得分:5)
在PHP中只有"0"
或空字符串强制为false;每隔一个非空字符串强制为true。来自manual:
转换为布尔值时,以下值被视为
FALSE
:
- 空字符串,字符串“0”
您需要编写自己的函数来处理字符串"true"
vs "false"
。在这里,我假设其他一切都默认为false:
function isBoolean($value) {
if ($value === "true") {
return true;
} else {
return false;
}
}
侧面说明可以很容易地压缩到
function isBoolean($value) {
return $value === "true";
}
答案 3 :(得分:4)
我最近需要一个“松散”的布尔转换函数来处理你要问的字符串(除其他外)。 I found a few different approaches and came up with a big set of test data to run through them。没有什么比我的需要更合适所以我自己写了:
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
。
您可以看到我使用的测试数据的行为以及其他几个函数here的结果。从那个小iframe中略过结果是很困难的,所以你可以view the script output in a full page来代替(该URL没有文档记录,因此这可能无法永久工作)。如果某些链接在某一天死亡,I put the code up on pastebin也是如此。
“应该是真实的”与不应该是非常随意的之间的界限;我使用的数据根据我的需求和审美偏好进行分类,您的数据可能会有所不同。
答案 4 :(得分:3)
我正在使用此构造将字符串变换为布尔值,因为对于大多数其他值,您需要true
:
$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
答案 5 :(得分:1)
PHP中是否有函数将“true”和“false”字符串解析为boolean?
不 - 两者都是字符串,而且(正如你所说)两者都评价为true
。只有空字符串在PHP中评估为false
。
您需要手动测试。但是,如果可能的话,最好使用“真实”布尔值。
答案 6 :(得分:0)
最安全地转换为布尔值的方法;
$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'
答案 7 :(得分:0)
如果您的API仅接受字符串“ true”或“ false”,
然后将其他所有内容变成null
,然后尝试:
$boolean = ['true' => true, 'false' => false][$inputString] ?? null;
这假设$input
不是对象。
空合并(??
)在PHP 7.0中引入。