在PHP中将字符串解析为布尔值


126

今天,我正在使用PHP,并且发现在某种情况下不能正确地将字符串值“ true”和“ false”解析为布尔值,例如考虑以下函数:

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


在您的代码中,isBoolean("")应返回false。
BoltClock

您应该考虑将接受的答案更改为Eric Caron的答案。它向您显示了一个本机函数,它可以满足您的要求。
指挥官

1
PHP不会考虑字符串说的是什么,“ false”只是五个字符,什么都没有。尽管它们是某种东西,所以true即使对于人类读者来说,布尔值的计算结果也似乎更直观FALSE
zeel

Answers:


413

有一种使用此方法的本地PHP方法,该方法使用PHP的filter_var方法:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

根据PHP的手册

对于“ 1”,“ true”,“ on”和“ yes”返回TRUE。否则返回FALSE。

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


这应该是公认的答案。内置PHP函数比构建自己的PHP函数更好。无需重新发明轮子!太可惜了,为时已晚:P
casraf 2013年

1
它还会小写比较的值吗?
Mobiletainment

3
@Mobiletainment,是的-它处理了您可以想象的$ value的大小写(false,FALSE,FalSe等)
Eric Caron

我的测试机坏了。使用==代替===进行比较。将删除我之前的评论,以免混淆他人。
andig 2015年

6
答案让我措手不及,因为您必须将标志添加FILTER_NULL_ON_FAILUREfilter_var()函数中,而不要FILTER_VALIDATE_BOOLEAN像我想的那样替换它。这将导致以下代码为我成功:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Dragon54 '17

14

原因是true,除了"0"and ""(空字符串)外,所有字符串将其转换为布尔值时的求和结果。

下面的函数将完全满足您的要求:它的行为与PHP完全相同,但还将字符串评估"false"false

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

该文档说明:http : //php.net/manual/zh/language.types.boolean.php

转换为布尔值时,以下值为FALSE:

  • 布尔值FALSE本身
  • 整数0(零)
  • 浮点数0.0(零)
  • 空字符串和字符串“ 0”
  • 零元素数组
  • 特殊类型NULL(包括未设置的变量)
  • 从空标签创建的SimpleXML对象

其他所有值均视为TRUE(包括任何资源)。


2
+1好。(可以在其中塞住一个低矮的人,但仅此而已。)
约翰·帕克

我认为middaparka的意思是将strtolower($ value)与'false'进行比较。将字面的“ false”传递到strtolower有点...。:)
Paul Dixon

@Paul Dixon是的,这就是我所指的。:-)
John Parker

2
@Marco-if($ value && strtolower($ value)!==“ faux”){如果您使用的是法语;if($ value && strtolower($ value)!==“ falsch”){用德语;if($ value && strtolower($ value)!==“ onwaar”){在荷兰...您可以理解为什么PHP没有内置此标准
Mark Ba​​ker

1
“将所有非空字符串转换为布尔值时,除“ 0”外,其结果均为true。”
BoltClock

5

仅在PHP中"0"或将空字符串强制转换为false;其他所有非空字符串都强制为true。从手册

转换为布尔值时,将考虑以下值FALSE

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

你需要编写自己的函数来处理字符串"true"VS "false"。在这里,我假设其他所有内容默认为false:

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

附带一提,可以很容易地凝结为

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

4

最近,我需要一个“松散”布尔转换函数来处理类似您所要求的字符串(以及其他事项)。 我找到了几种不同的方法,并提出了大量的测试数据来运行它们。没有什么适合我的需求的,所以我写了自己的:

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

您可以在此处查看我使用的测试数据的行为以及其他几个函数的结果。很难从那小幅iframe中浏览结果,因此您可以在整页中查看脚本输出(该URL没有文档说明,因此可能永远无法使用)。万一有一天这些链接消失了,我也将代码放在pastebin上

在“应该是真实的”和“不应该是真实的”之间的界限相当随意。我使用的数据是根据我的需求和审美偏好进行分类的,您的可能会有所不同。


此功能完美运行,谢谢!但是,你的链接现在404是
servermanfail

3

我正在使用此构造将字符串转换为布尔值,因为您需要true其他大多数值:

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

1

PHP中是否有一个函数可以将“ true”和“ false”字符串解析为布尔值?

否-两者都是字符串,且两者(如您所说)均为truefalse在PHP中,只有空字符串求和。

您将需要对此进行手动测试。但是,如果可能的话,最好使用“真实”布尔值代替。


1
并非所有的字符串都true在PHP中求值。
coreyward 2011年

1
没有纠正,只是澄清。说“都是字符串[并求值为true]”可能会给新手以错误的印象,尤其是来自另一种语言的输入规则更严格的输入规则,其中字符串是字符串,并且在将其转换为布尔值时,内容无关紧要(例如红宝石)。
coreyward 2011年

1
“在PHP中,只有空字符串的计算结果为false。” 但是非空字符串"0"呢?这不是也要评估false吗?
9

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'

0

如果您的API仅接受字符串“ true”或“ false”,而其他所有内容都变为null,请尝试:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

假设这$input不是一个对象。Null Coalesce(??)在PHP 7.0中引入。

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.