在 PHP 中将字符串解析为布尔值
Posted
技术标签:
【中文标题】在 PHP 中将字符串解析为布尔值【英文标题】:Parsing a string into a boolean value in PHP 【发布时间】:2011-06-14 02:26:47 【问题描述】:今天我在玩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。
您应该考虑将接受的答案更改为 Eric Caron 的答案。它向您展示了一个本机功能,可以满足您的要求。
PHP 不会思考 字符串所说的内容,“false”只是五个没有任何意义的字符。虽然它们是 something,所以布尔值的计算结果为 true
,即使对于人类读者来说,它似乎更直观地表示 FALSE
。
【参考方案1】:
如果您的 API 只接受字符串“true”或“false”,
其他一切都变成null
,然后尝试:
$boolean = ['true' => true, 'false' => false][$inputString] ?? null;
这假定$input
不是一个对象。
空合并 (??
) 在 PHP 7.0 中引入。
【讨论】:
【参考方案2】:有一个使用 PHP 的 filter_var 方法的原生 PHP 方法:
$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);
根据PHP's manual:
对于“1”、“true”、“on”和“yes”返回 TRUE。否则返回 FALSE。
如果设置了 FILTER_NULL_ON_FAILURE,则仅对“0”、“false”、“off”、“no”和“”返回 FALSE,对所有非布尔值返回 NULL。
【讨论】:
这应该是公认的答案。内置 PHP 函数比构建自己的要好。无需重新发明***!太糟糕了,为时已晚:P 它是否也小写了比较的值? @Mobiletainment,是的 - 它可以处理任何你能想象到的 $value 大小写(false、FALSE、FalSe 等) 我的测试用例失败了。使用 == 而不是 === 进行比较。将删除我之前的评论以免混淆。 答案让我措手不及,因为您必须将标志FILTER_NULL_ON_FAILURE
添加到 filter_var()
函数中,而不是像我想的那样用 FILTER_VALIDATE_BOOLEAN
替换它。这将导致以下代码对我有用:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
【参考方案3】:
安全转换为布尔值的最简单方法;
$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'
【讨论】:
【参考方案4】:我最近需要一个“松散”的布尔转换函数来处理您所询问的字符串(除其他外)。 I found a few different approaches and came up with a big set of test data to run through them。没有什么能满足我的需要,所以我自己写了:
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
的值。
您可以看到我使用的测试数据的行为以及其他几个函数here 的结果。从那个小 iframe 中略读结果有点困难,所以你可以 view the script output in a full page 代替(那个 URL 没有记录,所以这可能不会永远有效)。如果有一天这些链接失效,I put the code up on pastebin 也是如此。
“应该是真的”和“不应该是真的”之间的界限是相当随意的;我使用的数据是根据我的需求和审美偏好进行分类的,您的可能会有所不同。
【讨论】:
此功能完美运行,谢谢!但是您的链接现在是 404。【参考方案5】:原因是,除了"0"
和""
(空字符串)之外,所有字符串在将它们转换为布尔值时都会评估为true
。
以下函数将完全按照您的意愿行事:它的行为与 PHP 完全一样,但也会将字符串 "false"
评估为 false
:
function isBoolean($value)
if ($value && strtolower($value) !== "false")
return true;
else
return false;
文档解释说:http://php.net/manual/en/language.types.boolean.php:
当转换为布尔值时,以下值被视为 FALSE:
布尔值 FALSE 本身 整数 0(零) 浮点数 0.0(零) 空字符串和字符串“0” 零元素的数组 特殊类型 NULL(包括未设置的变量) 从空标签创建的 SimpleXML 对象所有其他值都被视为 TRUE(包括任何资源)。
【讨论】:
+1 不错。 (可以在那里放一个strtolower,但仅此而已。) 我认为 middaparka 意味着将 strtolower($value) 与“false”进行比较。将文字“假”传递给 strtolower 有点……愚蠢? :) @Paul Dixon 是的,这就是我所指的。 :-) @Marco - if ($value && strtolower($value) !== "faux") 如果你用法语工作; if ($value && strtolower($value) !== "falsch") 德语; if ($value && strtolower($value) !== "onwaar") 荷兰语...你可以理解为什么 PHP 没有将其作为标准内置 "所有 非空 字符串在将它们转换为布尔值时都会评估为真,“0”除外。”【参考方案6】:我正在使用此构造将字符串转换为布尔值,因为您希望 true
用于大多数其他值:
$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
【讨论】:
【参考方案7】:PHP中是否有一个函数可以将“true”和“false”字符串解析为布尔值?
不-两者都是字符串,并且(如您所说)都评估为true
。在 PHP 中,只有空字符串的计算结果为 false
。
您需要手动对此进行测试。不过,如果可能的话,最好使用“真正的”布尔值。
【讨论】:
并非所有字符串在 PHP 中都计算为true
。
没有纠正,只是澄清。说“两者都是字符串 [并且计算结果为 true
]”可能会给新手带来错误的印象,尤其是来自另一种语言的输入规则更严格的语言,其中字符串是字符串,而当它被转换为字符串时,内容并不重要布尔值(如 Ruby)。
“PHP 中只有空字符串的计算结果为 false。” 但是非空字符串 "0"
呢?这不也评估为false
吗?【参考方案8】:
仅在 PHP 中 "0"
或空字符串强制为 false;其他所有非空字符串都强制为真。来自manual:
转换为布尔值时,以下值被视为
空字符串和字符串“0”FALSE
:
您需要编写自己的函数来处理字符串"true"
与"false"
。在这里,我假设其他所有内容都默认为 false:
function isBoolean($value)
if ($value === "true")
return true;
else
return false;
旁注可以很容易地浓缩为
function isBoolean($value)
return $value === "true";
【讨论】:
以上是关于在 PHP 中将字符串解析为布尔值的主要内容,如果未能解决你的问题,请参考以下文章