【问题标题】:How to convert string to boolean php如何将字符串转换为布尔值 php
【发布时间】:2011-11-12 07:19:59
【问题描述】:

如何将字符串转换为boolean

$string = 'false';

$test_mode_mail = settype($string, 'boolean');

var_dump($test_mode_mail);

if($test_mode_mail) echo 'test mode is on.';

它返回,

布尔真

但应该是boolean false

【问题讨论】:

  • 为什么有人回答 $bool=!!$string1 ?
  • @zloctb 因为它没有回答问题。 !!$string1 将返回一个布尔值,指示评分最高的答案中概述的字符串。

标签: php string casting boolean


【解决方案1】:

此方法由@lauthiamkok 在 cmets 中发布。我把它贴在这里是为了引起更多的关注。

根据您的需要,您应该考虑将filter_var()FILTER_VALIDATE_BOOLEAN 标志一起使用。

filter_var(    true, FILTER_VALIDATE_BOOLEAN); // true
filter_var(    'true', FILTER_VALIDATE_BOOLEAN); // true
filter_var(         1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(       '1', FILTER_VALIDATE_BOOLEAN); // true
filter_var(      'on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(     'yes', FILTER_VALIDATE_BOOLEAN); // true

filter_var(   false, FILTER_VALIDATE_BOOLEAN); // false
filter_var(   'false', FILTER_VALIDATE_BOOLEAN); // false
filter_var(         0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(       '0', FILTER_VALIDATE_BOOLEAN); // false
filter_var(     'off', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      'no', FILTER_VALIDATE_BOOLEAN); // false
filter_var('asdfasdf', FILTER_VALIDATE_BOOLEAN); // false
filter_var(        '', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      null, FILTER_VALIDATE_BOOLEAN); // false

【讨论】:

  • 根据文档,此功能适用于 PHP 5 >= 5.2.0。 php.net/manual/en/function.filter-var.php
  • 我非常喜欢这种基于 WordPress 短代码属性设置布尔值的解决方案,这些属性的值包括 true、false、on、0 等。很好的答案,绝对应该是公认的答案。
  • filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) 对我来说效果更好。见php.net/manual/en/function.filter-var.php#121263
  • !!重要的提示 !!如果过滤器失败,filter_var 也会返回 FALSE。这可能会产生一些问题。
【解决方案2】:

字符串始终评估为布尔值 true,除非它们的值被 PHP 视为“空”(取自 documentation for empty):

  1. ""(空字符串);
  2. "0"(0 作为字符串)

如果您需要根据字符串的文本值设置布尔值,则需要检查该值是否存在。

$test_mode_mail = $string === 'true'? true: false;

编辑:上面的代码是为了便于理解。在实际使用中下面的代码可能更合适:

$test_mode_mail = ($string === 'true');

或者使用filter_var 函数可能会覆盖更多的布尔值:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_var 涵盖了全范围的值,包括真值"true""1""yes""on"。详情请见here

【讨论】:

  • 如果您不确定自己在做什么,我建议始终使用严格比较:$string === 'true'
  • 我发现了这个 - filter_var($string, FILTER_VALIDATE_BOOLEAN); 这是一件好事吗?
  • 三元似乎没有必要。为什么不直接将 $test_mode_mail 设置为不等式的值? $test_mode_mail = $string === 'true'
  • 但是 1/0,真/假呢?我认为@lauthiamkok 的答案是最好的。
  • @FelipeTadeo 我说的是 PHP 如何根据布尔运算评估字符串,我从来没有提到 eval() 并且我从不推荐在任何情况下使用它。字符串 "(3
【解决方案3】:

字符串"false" 实际上被PHP 视为"TRUE" 值。 文档说:

要将值显式转换为布尔值,请使用 (bool) 或 (boolean) 演员表。然而,在大多数情况下,强制转换是不必要的,因为一个值 如果操作符、函数或控件将自动转换 结构需要一个布尔参数。

另请参阅类型杂耍。

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

  • 布尔值 FALSE 本身

  • 整数 0(零)

  • 浮点数 0.0(零)

  • 空字符串,和字符串“0”

  • 零元素的数组

  • 具有零成员变量的对象(仅限 PHP 4)

  • 特殊类型NULL(包括未设置的变量)

  • 从空标签创建的 SimpleXML 对象

所有其他值都被视为 TRUE(包括任何资源)。

如果你这样做:

$bool = (boolean)"False";

$test = "false";
$bool = settype($test, 'boolean');

在这两种情况下$bool 将是TRUE。所以你必须手动完成,就像 GordonM 建议的那样。

【讨论】:

  • Euhm,当然较低的返回false。事实上,它抛出了一个致命的:)“致命错误:只有变量可以通过引用传递”。 $a = '假'; settype($a,'boolean'); var_dump($a);确实会返回 false。
【解决方案4】:

使用 JSON 时,我必须通过 $_POST 发送一个布尔值。当我做类似的事情时,我遇到了类似的问题:

if ( $_POST['myVar'] == true) {
    // do stuff;
}

在上面的代码中,我的布尔值被转换为 JSON 字符串。

要克服这个问题,您可以使用json_decode() 解码字符串:

//assume that : $_POST['myVar'] = 'true';
 if( json_decode('true') == true ) { //do your stuff; }

(这通常适用于转换为字符串并通过其他方式发送到服务器的布尔值,即,除了使用 JSON 之外。)

【讨论】:

    【解决方案5】:

    您可以使用 json_decode 来解码该布尔值

    $string = 'false';
    $boolean = json_decode($string);
    if($boolean) {
      // Do something
    } else {
      //Do something else
    }
    

    【讨论】:

    • 如果给定字符串是整数,json_decode 也将转换为整数
    • 是的,确实如此,但它提到该字符串包含布尔值
    【解决方案6】:
    (boolean)json_decode(strtolower($string))
    

    它处理$string的所有可能变体

    'true'  => true
    'True'  => true
    '1'     => true
    'false' => false
    'False' => false
    '0'     => false
    'foo'   => false
    ''      => false
    

    【讨论】:

    • onoff 怎么样?
    • @Cyclonecode 它不会像 вклвыкл 那样处理它。
    【解决方案7】:

    如果您的“布尔”变量来自全局数组,例如 $_POST 和 $_GET,您可以使用 filter_input() 过滤函数。

    POST 示例:

    $isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);
    

    如果您的“布尔”变量来自其他来源,您可以使用filter_var() 过滤函数。

    例子:

    filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
    

    【讨论】:

      【解决方案8】:

      你可以使用boolval($strValue)

      例子:

      <?php
      echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
      echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
      echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
      echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
      echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
      echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
      echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
      echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
      echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
      echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
      echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
      ?>
      

      文档 http://php.net/manual/es/function.boolval.php

      【讨论】:

      • echo boolval('false'); => 1
      • 你可以使用echo (int)'false;echo intval('false');
      • @anayarojo (int)'true'intval('true') 都返回 0(所有字符串都返回)
      【解决方案9】:

      最简单的做法是:

      $str = 'TRUE';
      
      $boolean = strtolower($str) == 'true' ? true : false;
      
      var_dump($boolean);
      

      这样做,您可以遍历一系列'true'、'TRUE'、'false'或'FALSE'并将字符串值转换为布尔值。

      【讨论】:

      • 您可以通过 $boolean = strtolower($str) == 'true'; 使上述内容更简单
      【解决方案10】:
      filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
      
      $string = 1; // true
      $string ='1'; // true
      $string = 'true'; // true
      $string = 'trUe'; // true
      $string = 'TRUE'; // true
      $string = 0; // false
      $string = '0'; // false
      $string = 'false'; // false
      $string = 'False'; // false
      $string = 'FALSE'; // false
      $string = 'sgffgfdg'; // null
      

      你必须指定

      FILTER_NULL_ON_FAILURE
      否则即使 $string 包含其他内容,您也将始终为假。

      【讨论】:

        【解决方案11】:

        其他答案过于复杂。这个问题只是逻辑问题。让你的陈述正确。

        $boolString = 'false';
        $result = 'true' === $boolString;
        

        现在你的答案将是

        • false,如果字符串是'false'
        • true,如果您的字符串是'true'

        我必须注意filter_var( $boolString, FILTER_VALIDATE_BOOLEAN ); 仍然是一个更好的选择如果你需要像on/yes/1 这样的字符串作为true 的别名。

        【讨论】:

          【解决方案12】:
          function stringToBool($string){
              return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
          }
          

          function stringToBool($string) {
              return filter_var($string, FILTER_VALIDATE_BOOLEAN);
          }
          

          【讨论】:

            【解决方案13】:

            我这样做的方式是将字符串“false”的任何不区分大小写的版本转换为布尔值 FALSE,但对所有其他字符串使用正常的 php 转换规则。我认为这是防止意外行为的最佳方法。

            $test_var = 'False';
            $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
            $result = (boolean) $test_var;
            

            或者作为一个函数:

            function safeBool($test_var){
                $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
                return (boolean) $test_var;
            }
            

            【讨论】:

              【解决方案14】:

              @GordonM 的回答很好。 但如果$string 已经是true(即字符串不是字符串而是布尔值TRUE),它就会失败......这似乎不合逻辑。

              扩展他的答案,我会使用:

              $test_mode_mail = ($string === 'true' OR $string === true));
              

              【讨论】:

                【解决方案15】:

                你也可以使用settype方法!

                $string = 'false';
                $boolean = settype($string,"boolean");
                var_dump($boolean); //see 0 or 1
                

                【讨论】:

                • 这是无效的 PHP 代码。这些术语的正确大小写应该是echosettype()。 PHP 还要求在每行末尾使用分号。我不知道这是如何获得 2 次赞成票的,并且还由不了解您在第 1 天学习的这些 PHP 绝对基础知识的人编辑。
                【解决方案16】:

                我对 wordpress 短代码属性感到困惑,我决定编写一个自定义函数来处理所有可能性。也许它对某人有用:

                function stringToBool($str){
                    if($str === 'true' || $str === 'TRUE' || $str === 'True' || $str === 'on' || $str === 'On' || $str === 'ON'){
                        $str = true;
                    }else{
                        $str = false;
                    }
                    return $str;
                }
                stringToBool($atts['onOrNot']);
                

                【讨论】:

                • 我一开始就在寻求帮助,但没有找到我希望的那么简单的事情。这就是我编写自己的函数的原因。随意使用它。
                • 也许将字符串降低到您不需要所有或条件$str = strtolower($str); return ($str == 'true' || $str == 'on');
                【解决方案17】:
                $string = 'false';
                
                $test_mode_mail = $string === 'false' ? false : true;
                
                var_dump($test_mode_mail);
                
                if($test_mode_mail) echo 'test mode is on.';
                

                你必须手动完成

                【讨论】:

                  【解决方案18】:

                  一种简单的方法是检查您认为正确的值数组。

                  $wannabebool = "false";
                  $isTrue = ["true",1,"yes","ok","wahr"];
                  $bool = in_array(strtolower($wannabebool),$isTrue);
                  

                  【讨论】:

                    【解决方案19】:

                    已编辑以显示使用 preg_match(); 根据包含 true 的字符串返回布尔值 true 或 false 的工作解决方案。与其他答案相比,这可能很重,但可以轻松调整以适应任何字符串以满足布尔需求。

                    $test_mode_mail = 'false';      
                    $test_mode_mail = 'true'; 
                    $test_mode_mail = 'true is not just a perception.';
                    
                    $test_mode_mail = gettype($test_mode_mail) !== 'boolean' ? (preg_match("/true/i", $test_mode_mail) === 1 ? true:false):$test_mode_mail;
                    
                    echo ($test_mode_mail === true ? 'true':'false')." ".gettype($test_mode_mail)." ".$test_mode_mail."<br>"; 
                    

                    【讨论】:

                    • 这不是被问到的。问题是如何将字符串转换为布尔值。
                    • @mrded 我已将答案编辑为可行的答案,因为您的评论是正确的。
                    【解决方案20】:

                    您应该能够使用 (bool) 转换为布尔值,但如果不检查这是否适用于字符串“true”和“false”,我不确定。

                    这可能值得一试

                    $myBool = (bool)"False"; 
                    
                    if ($myBool) {
                        //do something
                    }
                    

                    值得知道的是,以下内容在放入时将评估为布尔值 False

                    if()
                    
                    • 布尔值 FALSE 本身
                    • 整数 0(零)
                    • 浮点数 0.0(零)
                    • 空字符串和字符串“0”
                    • 零元素的数组
                    • 一个成员变量为零的对象(仅限 PHP 4)
                    • 特殊类型 NULL(包括未设置的变量)
                    • 从空标签创建的 SimpleXML 对象

                    其他一切都会评估为真。

                    如此处所述: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

                    【讨论】:

                    • 回应您第一段中的猜测:使用显式转换为布尔值会将"false" 转换为true
                    • 这将打印“true”$myBool = (bool)"False"; if ($myBool) { echo "true"; }
                    • 这是错误的,字符串被评估为真,除非它们包含“”或“0”。
                    猜你喜欢
                    • 2012-03-10
                    • 2011-02-17
                    • 2012-04-02
                    • 2021-02-23
                    • 1970-01-01
                    • 2018-09-07
                    • 1970-01-01
                    • 2016-07-13
                    相关资源
                    最近更新 更多