将包含某些布尔值的CSV转换为数组

时间:2019-01-01 20:02:46

标签: php arrays csv

多年以来,我一直在使用一个小函数将逗号分隔的值转换为数组,但是遇到一个实例,其中的值包含布尔值,这些布尔值似乎作为字符串传递,因此即使不应该将它们作为字符串传递也是如此。

看到这是正常现象,我发现了一些我尝试过的代码片段,它在数组中已有的值上很有效,而在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 = [];

1 个答案:

答案 0 :(得分:2)

正如注释中提到的,csv的值是无类型的。这意味着您不会将其视为布尔值truefalse

  

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;

}

作为旁注,我建议不要传递数组,然后将其重新循环回其自己的函数...在函数外部执行此操作,并使其尽可能简单。当添加不必要的噪音时,您应该使代码更复杂。