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

Posted

技术标签:

【中文标题】在 PHP 中将字符串解析为布尔值【英文标题】:Parsing a string into a boolean value in PHP 【发布时间】:2011-06-14 02:26:47 【问题描述】:

今天我在玩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。 您应该考虑将接受的答案更改为 Eric Caron 的答案。它向您展示了一个本机功能,可以满足您的要求。 PHP 不会思考 字符串所说的内容,“false”只是五个没有任何意义的字符。虽然它们是 something,所以布尔值的计算结果为 true,即使对于人类读者来说,它似乎更直观地表示 FALSE 【参考方案1】:

如果您的 API 只接受字符串“true”或“false”, 其他一切都变成null,然后尝试:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

这假定$input 不是一个对象。 空合并 (??) 在 PHP 7.0 中引入。

【讨论】:

【参考方案2】:

有一个使用 PHP 的 filter_var 方法的原生 PHP 方法:

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

【讨论】:

这应该是公认的答案。内置 PHP 函数比构建自己的要好。无需重新发明***!太糟糕了,为时已晚:P 它是否也小写了比较的值? @Mobiletainment,是的 - 它可以处理任何你能想象到的 $value 大小写(false、FALSE、FalSe 等) 我的测试用例失败了。使用 == 而不是 === 进行比较。将删除我之前的评论以免混淆。 答案让我措手不及,因为您必须将标志 FILTER_NULL_ON_FAILURE 添加到 filter_var() 函数中,而不是像我想的那样用 FILTER_VALIDATE_BOOLEAN 替换它。这将导致以下代码对我有用:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)【参考方案3】:

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

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

【讨论】:

【参考方案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 也是如此。

“应该是真的”和“不应该是真的”之间的界限是相当随意的;我使用的数据是根据我的需求和审美偏好进行分类的,您的可能会有所不同。

【讨论】:

此功能完美运行,谢谢!但是您的链接现在是 404。【参考方案5】:

原因是,除了"0"""(空字符串)之外,所有字符串在将它们转换为布尔值时都会评估为true

以下函数将完全按照您的意愿行事:它的行为与 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(包括任何资源)。

【讨论】:

+1 不错。 (可以在那里放一个strtolower,但仅此而已。) 我认为 middaparka 意味着将 strtolower($value) 与“false”进行比较。将文字“假”传递给 strtolower 有点……愚蠢? :) @Paul Dixon 是的,这就是我所指的。 :-) @Marco - if ($value && strtolower($value) !== "faux") 如果你用法语工作; if ($value && strtolower($value) !== "falsch") 德语; if ($value && strtolower($value) !== "onwaar") 荷兰语...你可以理解为什么 PHP 没有将其作为标准内置 "所有 非空 字符串在将它们转换为布尔值时都会评估为真,“0”除外。”【参考方案6】:

我正在使用此构造将字符串转换为布尔值,因为您希望 true 用于大多数其他值:

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

【讨论】:

【参考方案7】:

PHP中是否有一个函数可以将“true”和“false”字符串解析为布尔值?

不-两者都是字符串,并且(如您所说)都评估为true。在 PHP 中,只有空字符串的计算结果为 false

您需要手动对此进行测试。不过,如果可能的话,最好使用“真正的”布尔值。

【讨论】:

并非所有字符串在 PHP 中都计算为 true 没有纠正,只是澄清。说“两者都是字符串 [并且计算结果为 true]”可能会给新手带来错误的印象,尤其是来自另一种语言的输入规则更严格的语言,其中字符串是字符串,而当它被转换为字符串时,内容并不重要布尔值(如 Ruby)。 “PHP 中只有空字符串的计算结果为 false。” 但是非空字符串 "0" 呢?这不也评估为false吗?【参考方案8】:

仅在 PHP 中 "0" 或空字符串强制为 false;其他所有非空字符串都强制为真。来自manual:

转换为布尔值时,以下值被视为FALSE

空字符串和字符串“0”

您需要编写自己的函数来处理字符串"true""false"。在这里,我假设其他所有内容都默认为 false:

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

旁注可以很容易地浓缩为

function isBoolean($value) 
   return $value === "true";

【讨论】:

以上是关于在 PHP 中将字符串解析为布尔值的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中将字符串转换为布尔值[重复]

如何在 laravel 迁移中将字符串转换为布尔值?

如何在 Postgres 中将布尔数组转换为单个布尔值或单个字符串

如何在 Go 中将布尔值转换为字符串?

在 PHP 中将布尔表达式解析为 MySql 查询

Python将'True'和'False'解析为字符串[重复]