如何转换字符串布尔php

如何将字符串转换为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

418949 次浏览

字符串总是计算为布尔值true,除非它们有一个被PHP认为是“空”的值(取自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"。更多细节见在这里

字符串"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建议的那样。

你应该能够使用(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 < / p >

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

根据你的需要,你应该考虑使用带有FILTER_VALIDATE_BOOLEAN标志的filter_var()

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

其他的答案是过于复杂的事情。这个问题就是逻辑问题。只要你的陈述正确就行了。

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

现在你的答案是两者之一

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

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

你也可以使用settype方法!

$string = 'false';
$boolean = settype($string,"boolean");
var_dump($boolean); //see 0 or 1
function stringToBool($string){
return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

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

当使用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。)

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

延伸一下他的回答,我会用:

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

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

编辑后显示一个工作解决方案,使用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>";

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

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 = 'TRUE';


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


var_dump($boolean);

这样做,你可以循环一系列'true', 'true', 'false'或'false',并将字符串值获取为布尔值。

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

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

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

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

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

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

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

例如POST:

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

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

例子:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
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。

$string = 'false';


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


var_dump($test_mode_mail);


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

你必须手动操作