【问题标题】:Convert CSV Containing Some Boolean Values to Array将包含一些布尔值的 CSV 转换为数组
【发布时间】: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() 的位置确实是问题所在,所以谢谢!它现在可以正常工作了。

标签: php arrays csv


【解决方案1】:

正如 cmets 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;

}

作为旁注,我建议不要传递一个数组然后重新循环回到它自己的函数...在函数之外执行此操作,尽可能保持简单。当添加不必要的噪音时,您的代码应该会变得更复杂。

【讨论】:

  • 谢谢,我会按照建议修改我的 csv2Array,然后进行测试。顺便说一句,我只为问题嵌套了函数,但在我的实际代码中没有这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 2013-07-16
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多