多年以来,我一直在使用一个小函数将逗号分隔的值转换为数组,但是遇到一个实例,其中的值包含布尔值,这些布尔值似乎作为字符串传递,因此即使不应该将它们作为字符串传递也是如此。
看到这是正常现象,我发现了一些我尝试过的代码片段,它在数组中已有的值上很有效,而在CSV中的值上却没有效果。如何将TRUE / FALSE值保留为布尔值而不是字符串?
// Makes array from character-separated values; default comma
function csv2Array($string, $separator = ',') {
//Explode on comma
$vals = explode($separator, $string);
//Trim whitespace
foreach($vals as $key => $val) :
$vals[$key] = trim($val);
endforeach;
//Return empty array if no items found
return array_diff($vals, array(""));
}
function boolify($var) {
$ret = array();
if( is_array( $var ) ) foreach( $var as $ek=>$ev ) $ret[$ek] = boolify( $ev );
else if( $var === strtolower('false')) $ret = FALSE;
else if( $var === strtolower('true')) $ret = TRUE;
else $ret = $var;
return $ret;
}
$Buttons = "Save New,
Save Changes,
FALSE,
Delete Entry,
Are you sure?,
FALSE,
Save Copy,
FALSE,
Reset Typing,
FALSE,
Submit Clear";
$AsArray = csv2Array($Buttons,",");
var_dump(boolify($AsArray));
array(11) {
[0]=> string(12) "Save New"
[1]=> string(19) " Save Changes"
[2]=> string(12) " FALSE"
[3]=> string(19) " Delete Entry"
[4]=> string(20) " Are you sure?"
[5]=> string(12) " FALSE"
[6]=> string(17) " Save Copy"
[7]=> string(13) " FALSE"
[8]=> string(20) " Reset Typing"
[9]=> string(13) " FALSE"
[10]=> string(20) " Submit Clear" }
expected Booleans to be bool(FALSE)
注意:功能齐全的boolify()是:
function boolify($var) {
$ret = array();
if (is_array($var)) foreach($var as $ek=>$ev) $ret[$ek] = boolify($ev);
elseif (strtolower($var) === 'false') $ret = FALSE;
elseif (strtolower($var) === 'true') $ret = TRUE;
else $ret = $var;
return $ret;
}
更新:我不得不添加$ ret = array();到boolify()函数以消除偶发错误。如果运行PHP 7.X,则可以包含$ ret = [];
答案 0 :(得分:2)
正如注释中提到的,csv
的值是无类型的。这意味着您不会将其视为布尔值true
或false
。
PHP在变量声明中不需要(或支持)显式类型定义;变量的类型由使用该变量的上下文确定。也就是说,如果将字符串值分配给变量$ var,则$ var成为字符串。如果然后将一个整数值分配给$ var,它将变成一个整数。
您可以做的一件事就是转换其类型。 PHP允许您更改类型(有效时)。要了解有关此内容的更多信息,请阅读他们的documentation here。
例如:
$stringBoolean = 'true';
echo type($stringBoolean); // string
echo type((bool) $stringBoolean); // bool
实际上,您可以执行以下操作:
function csv2Array($string, $separator = ',') {
//Explode on comma
$vals = explode($separator, $string);
//Trim whitespace
foreach($vals as $key => $val) :
if( $val == 'FALSE' || $val == 'TRUE' ) {
$val = (bool) $val;
}
$vals[$key] = trim($val);
endforeach;
//Return empty array if no items found
return array_diff($vals, array(""));
}
或者,如果您想保留boolify()
功能,可以执行以下操作:
/**
* Cast type to bool
*
* @param string $value
* @return mixed
*/
function boolify( string $value )
{
if( strtolower($value) === 'false' || strtolower($value) === 'true' )
return (boolean) $value;
return $value;
}
作为旁注,我建议不要传递数组,然后将其重新循环回其自己的函数...在函数外部执行此操作,并使其尽可能简单。当添加不必要的噪音时,您应该使代码更复杂。