检查布尔值是否为真或假

3

我有这样一段小代码:

$company = array('relation' => $_SESSION['username']);
$companyresponse = $wcfclient->GetCompany($company);
    foreach ($companyresponse->GetCompanyResult as $key => $value){
    echo $value[0]; //This is the name of the company

    if ($value[1] == TRUE){
       echo "Company blocked";
    }
    elseif($value[1] == FALSE){
       echo "Company NOT blocked";
    }
    echo $value[1]; //This gives me the correct result, in this case: FALSE
$value[1]的结果是FALSE,虽然当它通过我的if语句时返回了"公司被阻止",所以$value[1]是TRUE,但它应该是FALSE。
有人能告诉我为什么它没有返回正确的值吗?
我也尝试过这样做:
if ($value[1] == 1){
   echo "Company blocked";
}
else{
   echo "Company NOT blocked";
}

这给我一个FALSE的值,但不知怎么的,if语句把它变成了TRUE。

var_dump($value[1]) 

当我尝试一个通常被屏蔽的公司时,它会给出正确的结果:

string(4) "True" 公司已被屏蔽True


1
if 语句之前添加 var_dump($value[1]) 来确保值。同时使用 === 替代 == - RRikesh
当您使用if($value[1]){echo "公司已被封锁";}else{echo "公司未被封锁";}时,会得到什么结果? - rags
这给了我结果:string(5) "False" False,当我把 == 改成 === 时 echo 没有任何值。 - Matheno
当我尝试访问一个通常被阻止的公司时,它会给出正确的结果:string(4) "True" 公司已被阻止True。 - Matheno
@Marijke 任何非空字符串,即不是空字符串 "" 或字符串零 "0" 的字符串都会被评估为 TRUE。这意味着 "hello", "true", "false", "foo bar" 都会被评估为 TRUE,无论字符串本身说什么。换句话说,"True" 评估为 TRUE,"False" 也评估为 TRUE。 - BLaZuRE
显示剩余9条评论
3个回答

7
$value的类型是"String"而不是"bool"。1

When converting to boolean, the following values are considered FALSE:

the boolean FALSE itself
the integer 0 (zero)
the float 0.0 (zero)
the empty string, and the string "0"
an array with zero elements
an object with zero member variables (PHP 4 only)
the special type NULL (including unset variables)
SimpleXML objects created from empty tags

Every other value is considered TRUE (including any resource).

参考资料:转换为布尔值(PHP 手册)

所以,"False" == TRUE 是成立的!

也许你可以将它们作为字符串比较:

if(strtoupper($value[1]) == "TRUE"){
    //...
}else{
    //...
}

1
希望这个能够工作。
elseif(!isset($value[1]) || $value[1] === FALSE){
  echo "Company NOT blocked";
}

阅读了您的评论后,我制作了这个解决方案。看起来很愚蠢,但希望能够有效。

if ($value[1] == "True"){
   echo "Company blocked";
}
elseif($value[1]  == "False"){
   echo "Company NOT blocked";
}

现在也没有回声,当我使用===时,我将用==进行测试。 - Matheno
当使用==时,给我公司被阻止的结果。所以仍然不是正确的值。它将$value[1]更改为TRUE,而应该是FALSE。 - Matheno
为一个尴尬的比较提供合理解决方案,加1分。 - BLaZuRE

0

在我看来,$value[1] 包含的是文本字面值 "TRUE" 或 "FALSE",而不是布尔值 TRUE 或 FALSE。

请将您的代码更改为 if (strcasecmp($value[1], "TRUE") == 0)){ 来测试是否是这种情况。

echo $value[1]; //This gives me the correct result, in this case: FALSE

echo不会像那样输出布尔值。当您将字符串转换为布尔值时,如果它具有任何长度,则为true。这将导致它始终走向true路线。

编辑:

您的编辑证实了这一点,“string(4)“True”Company blockedTrue”表示它不是布尔值而是字符串。上面的代码应该可以工作。


现在它一直给我返回“公司未被阻止”的结果,无论真假。 - Matheno
编程语言往往是大小写敏感的。这意味着它们不知道 "TrUe" 和 "TRUE" 和 "true" 之间有什么区别。PHP 将它们视为不同的字符串。但是,布尔值 TRUE 不是字符串,而是布尔类型的值。布尔值 TRUE 绝不等同于字符串值 "True"。 - BLaZuRE
@BLaZuRE 看一下他的 var dump,它显示的是一个字符串而不是布尔值。 - exussum
@user1281385 我理解他正在输出一个字符串,但我觉得他缺乏对布尔值和包含表示布尔值的单词符号的字符串之间的区别的理解。我试图帮助他长期解决问题,而不仅仅是针对这个问题。 - BLaZuRE
她 = 她的;) 当我在我的if语句中将其作为字符串处理时,我得不到正确的结果。无论我将其作为布尔值处理时都是如此。 - Matheno
显示剩余2条评论

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