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

时间:2011-01-23 17:38:49

标签: php parsing boolean

今天我正在玩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?

8 个答案:

答案 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中引入。