如何将字符串转换为布尔值(PHP)

457

如何将字符串转换为 boolean 类型?

$string = 'false';

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

var_dump($test_mode_mail);

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

它返回,

布尔值true

但应该是布尔值false


为什么没有人回答关于 $bool=!!$string1 的问题? - zloctb
1
@zloctb 因为它没有回答问题。!!$string1将返回一个布尔值,指示在最高评价答案中概述的字符串。 - David Barker
20个回答

882

这个方法是由@lauthiamkok在评论中发布的。我将其作为答案发布在这里,以引起更多关注。

根据您的需求,您应该考虑使用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

6
我非常喜欢这个解决方案,可以根据WordPress短代码属性设置布尔值,这些属性的值可以是true、false、on、0等。很棒的答案,肯定应该成为被采纳的答案。 - AndyWarren
16
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) 对我来说效果更好。参见 http://php.net/manual/zh/function.filter-var.php#121263 - Ryan
2
!! 重要提示 !! filter_var 函数在过滤失败时也会返回 FALSE。这可能会导致一些问题。 - AFA Med
1
这个答案 filter_var($string, FILTER_VALIDATE_BOOLEAN); 在几乎所有情况下都是可用的答案。我很惊讶原帖的作者标记了其他答案为被采纳的答案。 - HenryHayes
这是最佳答案的又一个加分。 - Tami
这对我有所帮助,但我感到沮丧因为我必须这样做。以前在 PHP 中从未出现过这种问题。也许我只是没有注意到! - James Baird

480

在PHP中,除非字符串的值被认为是“空”的(取自empty函数的文档),否则字符串总是被视为布尔值true:

  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"。有关更多详细信息,请参见此处


6
我建议始终使用严格比较,如果您不确定自己在做什么:$string === 'true' - Markus Hedlund
282
我发现这段代码 - filter_var($string, FILTER_VALIDATE_BOOLEAN);,这是个好东西吗? - Run
12
三元运算符似乎不是必需的。为什么不直接将$test_mode_mail设置为不等式的值?$test_mode_mail = $string === 'true' - Tim Banks
3
1/0和TRUE/FALSE怎么办?我认为@lauthiamkok的回答是最好的。 - ryabenko-pro
2
@FelipeTadeo 我在谈论PHP如何在布尔运算中评估字符串,我从未提到过eval(),也绝不建议在任何情况下使用它。字符串“(3 < 5)”将被PHP评估为布尔值true,因为它不是空的。 - GordonM
显示剩余5条评论

44

在PHP中,字符串"false"实际上被认为是一个"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建议的那样手动处理。


1
当然,下面的函数返回false。实际上,它会抛出一个严重错误:“致命错误:只有变量可以通过引用传递”。$a = 'False'; settype($a,'boolean'); var_dump($a);确实会返回false。 - Rob

20

在处理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。)

18

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

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

json_decode函数也会将给定的字符串转换为整数。 - Mihai Răducanu
1
是的,没错,但是已经提到该字符串保存了布尔值。 - isnvi23h4

12
(boolean)json_decode(strtolower($string))

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

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

2
onoff怎么样? - Cyclonecode
@Cyclonecode 它不会像 вклвыкл 一样处理它。 - mrded

10
如果您的“boolean”变量来自全局数组,例如$_POST和$_GET,您可以使用filter_input()过滤函数。
POST示例:
$isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);
如果您的“boolean”变量来自其他来源,您可以使用filter_var()过滤函数。
示例:
filter_var('true', FILTER_VALIDATE_BOOLEAN); // true

7
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包含其他内容,结果也将始终为false。


4
最简单的做法是这样的:
$str = 'TRUE';

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

var_dump($boolean);

通过这种方式,您可以循环遍历一系列的 'true'、'TRUE'、'false' 或 'FALSE' 并将字符串值转换为布尔值。


1
你可以通过 $boolean = strtolower($str) == 'true'; 来简化上述代码。 - Cyclonecode

3
其他答案把事情复杂化了。这个问题只是一个逻辑问题。确保您的陈述正确即可。
$boolString = 'false';
$result = 'true' === $boolString;

现在你的答案将是:
  • 如果字符串是'false',则为false
  • 如果字符串是'true',则为true
需要注意的是,如果您需要使用'on/yes/1'作为true的别名,则filter_var($boolString, FILTER_VALIDATE_BOOLEAN);仍然是更好的选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接