在PHP中将字符串解析为布尔值

144

今天我在使用PHP时发现,在条件语句中,字符串值"true"和"false"不能被正确解析为布尔值。例如,考虑以下函数:

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"字符串解析为布尔值?


在你的代码中,isBoolean("") 应该返回 false。 - BoltClock
1
PHP不会“思考”字符串的含义,“false”只是五个毫无意义的字符。它们确实代表了某些东西,所以布尔值计算为true,即使对于人类读者来说,它似乎更符合直觉地表示为FALSE - zeel
8个回答

468

有一种使用PHP的filter_var方法来实现此操作的本地PHP方法:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

根据PHP手册

对于 "1", "true", "on" 和 "yes" 返回 TRUE,否则返回 FALSE。

如果设置 FILTER_NULL_ON_FAILURE,则仅对于 "0", "false", "off", "no", 和 "" 返回 FALSE,并且对于所有非布尔值都返回 NULL。


1
它是否也将值转换为小写以进行比较? - Mobiletainment
3
@Mobiletainment,是的 - 它可以处理您想象得到的任何大小写形式的 $value(false、FALSE、FalSe等)。 - Eric Caron
我的测试用例出了问题。我在比较时使用了“==”而不是“===”。我会删除之前的评论,以免让人们感到困惑。 - andig
我以前从未见过这个。非常棒的解决方案。 - Patrick
7
答案让我措手不及,因为你需要将标志“FILTER_NULL_ON_FAILURE”添加到“filter_var()”函数中,而不是像我想的那样用“FILTER_VALIDATE_BOOLEAN”替换它。这会导致以下代码为我解决问题: $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) - Dragon54
显示剩余2条评论

16

原因是在将字符串转换为布尔值时,除了空字符串""和字符串"0"外,所有字符串都会被转换为true

下面的函数会完全按照您的要求执行:它的行为与PHP完全相同,但还将字符串"false"评估为false

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}
文档解释如下:http://php.net/manual/zh/language.types.boolean.php
将值转换为布尔值时,以下值被视为FALSE:
- 布尔值FALSE本身 - 整数0(零) - 浮点数0.0(零) - 空字符串和字符串"0" - 元素数量为零的数组 - 特殊类型NULL(包括未定义的变量) - 从空标记创建的SimpleXML对象 其他所有值都被视为TRUE(包括任何资源)。

2
@Marco - 如果 ($value && strtolower($value) !== "faux") { 如果你在法国工作; 如果 ($value && strtolower($value) !== "falsch") { 在德国; 如果 ($value && strtolower($value) !== "onwaar") { 在荷兰... 你可以理解为什么PHP没有将此作为标准内置。 - Mark Baker
1
所有非空字符串在转换为布尔值时都会评估为true,除了“0”。 - BoltClock

6

在 PHP 中,只有"0"或空字符串被强制转换为false;其他任何非空字符串都会被强制转换为true。根据 PHP 手册

在布尔值的上下文环境中,以下值被认为是 FALSE

  • 空字符串和字符串 "0"

你需要编写自己的函数来处理字符串"true""false"。在此,我假设其他所有情况默认为false:

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

在这个侧面的注释中,可以轻松地压缩为:
function isBoolean($value) {
   return $value === "true";
}

4
我最近需要一个"宽松"的布尔转换函数来处理像你所问的那样的字符串(以及其他一些东西)。我找到了几种不同的方法,并想出了一组大量的测试数据来运行它们。没有一个完全符合我的需求,所以我写了自己的:
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,则无论(string) $object的值如何,它都将返回(boolean) count($object)
您可以查看我使用的测试数据的行为以及几个其他函数的结果here。从那个小的iframe中浏览结果有点困难,所以您可以view the script output in a full page,而不是。在某些链接死亡的情况下,I put the code up on pastebin as well.
“应该是真实的”和“不应该是真实的”的界限相当任意;我使用的数据基于我的需求和审美偏好进行分类,您的可能不同。

这个函数运行得非常完美,谢谢!但是你的链接现在是404。 - servermanfail

3

我使用这个结构将字符串转换为布尔型,因为对于大多数其他值,您都希望得到true

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

1
PHP中是否有将“true”和“false”字符串解析为布尔值的函数?
没有 - 两者都是字符串,这两个字符串(如您所说)都会评估为true。在PHP中,只有空字符串会评估为false
您需要手动测试此功能。如果可能的话,最好使用“真正”的布尔值进行操作。

1
在 PHP 中,并非所有字符串都会被评估为“true”。 - coreyward
1
不是在修改,只是澄清。说“两者都是字符串[并且评估为true]”可能会给新手留下错误的印象,特别是来自另一种类型规则更为严格的语言(如Ruby)的新手,其中字符串是字符串,当将其转换为布尔值时内容并不重要。 - coreyward
1
在 PHP 中,只有空字符串被计算为假。但是非空字符串“0”呢?它也会被计算为假吗? - Sepster

1

安全转换为布尔值的最简单方法;

    $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'

0
如果您的API只接受字符串"true"或"false",而其他所有内容都将变为null,则请尝试:
$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

假设$input不是一个对象。 空合并运算符(??)在PHP 7.0中被引入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接