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


318

如何将字符串转换为boolean

$string = 'false';

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

var_dump($test_mode_mail);

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

它返回

布尔值true

但应该如此boolean false


为什么有人回答$ bool = !! $ string1呢?
zloctb

1
@zloctb,因为它无法回答问题。!!$string1会返回一个布尔值,该布尔值表示评分最高的答案中列出的字符串。
大卫·巴克

Answers:


347

除非字符串的值被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覆盖整个范围的值,包括truthy值"true""1""yes""on"。有关更多详细信息,请参见此处


5
我建议始终使用严格的比较,如果您不确定自己在做什么:$string === 'true'
Znarkus 2011年

248
我发现了- filter_var($string, FILTER_VALIDATE_BOOLEAN);这是一件好事吗?
laukok 2011年

10
三元似乎没有必要。为什么不将$ test_mode_mail设置为不等式的值呢?$ test_mode_mail = $ string ==='true'–
Tim Banks

3
但是1/0,正确/错误呢?我认为@lauthiamkok的答案是最好的。
ryabenko-pro 2012年

1
@FelipeTadeo我在谈论PHP如何根据布尔运算评估字符串,我从未提到过eval(),并且我绝不建议在任何情况下都使用它。PHP将字符串“(3 <5)”评估为布尔值true,因为它不为空。
GordonM 2013年

647

该方法由@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

5
根据文档,此功能可用于PHP 5> = 5.2.0。php.net/manual/en/function.filter-var.php
Westy92

4
我真的很喜欢这种基于WordPress短代码属性设置布尔值的解决方案,该属性具有true,false,on,0等值。很好的答案,应该绝对是可接受的答案。
安迪·沃伦(AndyWarren)2017年

11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)为我工作得更好。参见php.net/manual/en/function.filter-var.php#121263
Ryan

!! 重要的提示 !!如果过滤器失败,filter_var也返回FALSE。这可能会产生一些问题。
AFA Med

35

"false" 实际上"TRUE",PHP 将该字符串视为一个值。该文档说:

要将值显式转换为布尔值,请使用(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
Euhm,当然,下一个会返回false。实际上,它引发致命错误:)“致命错误:只能通过引用传递变量”。$ a ='假'; settype($ a,'boolean'); var_dump($ a); 确实会返回false。
罗布

16

使用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以外的方式)发送到服务器。)


11

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

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

如果给定的字符串是整数,则json_decode也将转​​换为整数
MihaiRăducanu16年

1
是的,这是真的,但它提到字符串持有布尔值
souparno majumder

8
(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

7

您可以使用 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


2
echo boolval('false');=> 1
Mubashar

您可以使用echo (int)'false;echo intval('false');
anayarojo

@anayarojo (int)'true'intval('true')都返回0,以及(所有字符串做)
sketchyTech

4

最简单的事情是这样的:

$str = 'TRUE';

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

var_dump($boolean);

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


3

其他答案是使事情复杂化。这个问题仅仅是逻辑问题。正确地陈述您的话。

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

现在您的答案将是

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

我必须指出,如果您需要使用字符串作为的别名,filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );仍然会是一个更好的选择。on/yes/1true


3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

要么

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

3
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。


2

您也可以使用settype方法!

SetType($ var,“ Boolean”)Echo $ var //请参见0或1


2

我这样做的方式是将字符串“ 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;
}

2

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

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

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

0

我对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']);

1
我最初是在寻求帮助,但没有找到我所希望的那么容易。这就是为什么我编写了自己的函数。随意使用它。
tomi 2016年

-1

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

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

-1

编辑以显示此处未提及的可能性,因为我的原始答案与OP的问题无关。

preg_match(); 可以使用。但是,在大多数应用程序中,使用起来比这里的其他答案要重得多。

if (preg_match("/true/i", "true PHP is a web scripting language of choice.")) {
    echo "<br><br>Returned true";
} else {
    echo "<br><br>Returned False";
}

/(?:true)|(?:1)/i如果在某些情况下需要,也可以使用。计算包含“ false”和“ 1”的字符串时,它将无法正确返回。


这不是被要求的。问题是如何将字符串转换为布尔值。
6

默德:我看错了我道歉的问题。因此,本着良好的精神,我将添加此处未提及的另一种可能性。
JSG

-1

在PHP中,您可以使用double not运算符!!)将值转换为布尔值:

var_dump(!! true);     // true
var_dump(!! "Hello");  // true
var_dump(!! 1);        // true
var_dump(!! [1, 2]);   // true
var_dump(!! false);    // false
var_dump(!! null);     // false
var_dump(!! []);       // false
var_dump(!! 0);        // false
var_dump(!! '');       // false

-4

您应该可以使用(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/zh/language.types.boolean.php#language.types.boolean.casting


6
为了回应您在第一段中的猜测:对布尔值使用显式强制转换将转换"false"true
Mark Amery

2
这将打印“ true”$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH

2
这是错误的,除非字符串包含“”或“ 0”,否则它们将被评估为true。
Michael J. Calkins
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.