Php 将包含一些布尔值的CSV转换为数组
多年来,我一直在使用一个小函数将逗号分隔的值转换为数组,但遇到了一个实例,其中的值包含布尔值,这些布尔值似乎是作为字符串传递的,因此即使它们不应该是布尔值,它们也是真的 看到这很正常,我找到了一段我尝试过的代码,它可以很好地处理数组中已经存在的值,但不能处理来自CSV的值。如何将真/假值保持为布尔值而不是字符串Php 将包含一些布尔值的CSV转换为数组,php,arrays,csv,Php,Arrays,Csv,多年来,我一直在使用一个小函数将逗号分隔的值转换为数组,但遇到了一个实例,其中的值包含布尔值,这些布尔值似乎是作为字符串传递的,因此即使它们不应该是布尔值,它们也是真的 看到这很正常,我找到了一段我尝试过的代码,它可以很好地处理数组中已经存在的值,但不能处理来自CSV的值。如何将真/假值保持为布尔值而不是字符串 // Makes array from character-separated values; default comma function csv2Array($string, $se
// 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()是:
更新:我必须添加$ret=array();调用boolify()函数以消除偶尔出现的错误。如果运行PHP7.X,它可以有$ret=[] 正如注释中所述,
csv
值的类型较少。这意味着您不会将其视为布尔值true
或false
PHP不需要(或支持)变量声明中的显式类型定义;变量的类型由使用该变量的上下文决定。也就是说,如果将字符串值分配给变量$var,$var将成为字符串。如果将整数值分配给$var,则它将变为整数
要转换它们的类型,可以做的一件事是强制转换它。PHP允许您更改类型(如果有效)。要了解更多信息,您可以阅读他们的
例如:
$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;
}
作为补充说明,我建议不要将数组传递给它,然后再将其重新加载回自己的函数。。。在函数之外这样做,尽可能保持简单。当添加不必要的噪声时,您会使代码变得更复杂。
如果($var===strtolower('false'))
--错误的方法。尝试if(strtolower($var)==“false”)
(与true
检查相同)无法将这些值“保留”为布尔值,因为它们不是布尔值。它们是字符串,只有你把它们解释为布尔值。但从技术上讲,csv F结构con只包含字符串,它是无类型的。所以你需要转换,或者在这里添加一个解释步骤,将字符串“FALSE”和“TRUE”转换为你想要的值。是的,我知道数组传递字符串,这是我发布时的语义问题。不知怎的,我已经进入了一个向导,因为我发布了一个问题,这使问题变得更加困难。无论如何,我把strtolower()放在哪里确实是个问题,谢谢!它现在正常工作了。谢谢,我将按照建议修改我的csv2Array,然后对它进行测试。顺便说一句,我只为这个问题嵌套了函数,但没有在实际代码中这样做。
/**
* 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;
}