【问题标题】:Parsing a string into a boolean value in PHP在 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

标签: php parsing boolean


【解决方案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";
        }
        

        【讨论】:

          猜你喜欢
          • 2019-02-10
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 1970-01-01
          • 2021-02-10
          • 2012-03-10
          • 2011-07-10
          • 1970-01-01
          相关资源
          最近更新 更多