Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将包含一些布尔值的CSV转换为数组_Php_Arrays_Csv - Fatal编程技术网

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

Php 将包含一些布尔值的CSV转换为数组,php,arrays,csv,Php,Arrays,Csv,多年来,我一直在使用一个小函数将逗号分隔的值转换为数组,但遇到了一个实例,其中的值包含布尔值,这些布尔值似乎是作为字符串传递的,因此即使它们不应该是布尔值,它们也是真的 看到这很正常,我找到了一段我尝试过的代码,它可以很好地处理数组中已经存在的值,但不能处理来自CSV的值。如何将真/假值保持为布尔值而不是字符串 // Makes array from character-separated values; default comma function csv2Array($string, $se

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

看到这很正常,我找到了一段我尝试过的代码,它可以很好地处理数组中已经存在的值,但不能处理来自CSV的值。如何将真/假值保持为布尔值而不是字符串

// 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;

}