在PHP中将stringparsing为布尔值

今天我在玩PHP,发现string值“true”和“false”在一个条件下没有被正确地parsing为布尔值,例如考虑下面的函数:

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中有一个本地函数来parsing“true”和“false”string为布尔值吗?

有一个使用PHP的filter_var方法的原生PHP方法:

 $bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

根据PHP的手册:

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

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

原因是所有string在转换为布尔值时都计算为true ,除了"0""" (空string)。

以下函数将完全按照您的要求进行:它的行为与PHP完全相同,但也会将string"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(零)
  • 空string和string“0”
  • 具有零元素的数组
  • 特殊types的NULL(包括未设置的variables)
  • 由空标签创build的SimpleXML对象

其他每个值都被视为TRUE(包括任何资源)。

在PHP中只有"0"或空string强制为false; 其他每个非空string都强制为true。 从手册 :

转换为布尔值时,以下值被认为是FALSE

  • 空string和string“0”

你需要编写你自己的函数来处理string"true""false" 。 在这里,我假设一切都默认为false:

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

在一个侧面说明,可以很容易地浓缩

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

我使用这个构造来将string变形为布尔值,因为对于大多数其他值,您需要true

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

我最近需要一个“松散的”布尔转换函数来处理string,比如你正在询问的string(等等)。 我发现了一些不同的方法,并提出了一套大量的testing数据来贯穿它们 。 没有什么东西符合我的需要,所以我写了自己的:

 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; } } 

请注意,对于既可数又可串可转换的对象,这将有利于string值的计数以确定真实性。 也就是说,如果$object instanceof Countable这个将会返回(boolean) count($object)而不pipe(string) $object的值。

您可以看到我使用的testing数据的行为以及其他几个函数的结果 。 这是很难从这个小iframe的结果,所以你可以查看脚本输出在一个完整的页面 ,而不是(该url是没有logging,所以这可能不会永远工作)。 如果这些链接有一天死了, 我也把代码放在pastebin上 。

什么“应该是真实的”和“不应该的”之间的界限是非常随意的。 我使用的数据是根据我的需求和美学偏好分类的,您可能会有所不同。

在PHP中有一个函数来parsing“true”和“false”string为布尔值吗?

没有 – 两个都是string,而这两者(就像你说的)评估为true 。 在PHP中,只有空string评估为false

你需要手动testing。 如果可能的话,最好使用“真正的”布尔值。

最简单的方法来安全地转换为布尔值;

  $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'