【发布时间】:2019-05-28 15:23:48
【问题描述】:
多年来,我一直在使用一个小函数将逗号分隔的值转换为数组,但遇到了一个实例,其中值包含布尔值,这些值似乎作为字符串传递,因此即使它们不应该是真实的也是如此.
看到这很正常,我发现了一些我尝试过的代码 sn-p,它适用于已经在数组中的值,但不适用于来自 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 = [];
【问题讨论】:
-
if( $var === strtolower('false'))-- 错误的方式。试试if( strtolower($var) === 'false'))(true检查相同) -
您不能将这些值“保留”为布尔值,因为它们不是布尔值。它们是字符串,只有你将它们解释为布尔值。但从技术上讲,csv fstructure con 只包含字符串,它是无类型的。所以你需要转换,或者在这里添加一个解释步骤,将字符串“FALSE”和“TRUE”转换为你想要的值。
-
是的,我知道数组传递字符串,这是我发布时的语义问题。不知何故,我进入了某个向导,因为我发布了使问题变得更加困难的问题。无论如何,我放置 strtolower() 的位置确实是问题所在,所以谢谢!它现在可以正常工作了。