2011-01-23 117 views
89

今天我正在玩PHP,发现字符串值“true”和“false”在条件中未正确解析为布尔值,例如考虑以下函数:在PHP中将字符串解析为布尔值

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

+0

在你的代码中,`isBoolean(“”)`应该返回false。 – BoltClock 2011-01-23 17:47:45

+0

@BoltClock更新,thx – Mark 2011-01-23 17:50:14

+0

你应该考虑改变对Eric Caron答案的接受答案。它向你展示了一个原生功能,它可以满足你的要求。 – 2013-07-29 18:50:23

回答

306

有这样做的,它使用PHP的filter_var方法的本地PHP方法:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

根据PHP手册:

返回TRUE为 “1”, “真实”, “上” 和“y ES”。否则返回FALSE。

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

12

原因是所有字符串在将它们转换为布尔值时计算为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(包括任何资源)。

4

在PHP中只有"0"或空字符串强制为false;其他每个非空字符串都强制为true。从manual

当转换为boolean时,以下值被认为FALSE

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

你需要写你自己的功能来处理字符串"true" vs "false"。在这里,我承担一切默认为false:

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

在一个侧面说明,可以很容易地被冷凝成

function isBoolean($value) { 
    return $value === "true"; 
} 
1

是否有PHP函数解析“真”和“假“字符串到布尔?

否 - 都是字符串,并且这两者(如您所说)评估为true。在PHP中,只有空字符串评估为false

您需要手动测试。但是,如果可能的话,最好使用“真正的”布尔值。

3

我使用这个结构变身字符串转换为布尔值,因为你想true大多数其他值:

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

我最近需要一个“松散的”布尔转换函数来处理字符串,比如你正在询问的字符串(等等)。 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

“应该是真的”和“不应该的”之间的界限非常随意;我使用的数据是根据我的需要和美学偏好分类的,您可能会有所不同。

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'