在使用str_getcsv()创建的数组上获取“未定义索引”;但是var_dump()显示密钥存在

时间:2019-02-19 05:55:58

标签: php arrays undefined-index

我有一个使用str_getcsv()创建的数组:

$array = array_map('str_getcsv', file($file['tmp_name']));
array_walk($array, function(&$a) use ($array) {
    $a = array_combine($array[0], $a);
});
array_shift($array);

返回的$arrayvar_dump($array)输出。

array(18) {
  ["fund"]=>
  string(6) "Fund 1"
  ["name"]=>
  string(13) "Property Name"
  ["investment"]=>
  string(13) "Investment Name"
  ["region"]=>
  string(6) "London"
  ["sector"]=>
  string(6) "Office"
  ["status"]=>
  string(8) "Published"
  ["description"]=>
  string(0) ""
  ["acquisition_date"]=>
  string(0) ""
  ["size"]=>
  string(0) ""
  ["address_line_1"]=>
  string(0) ""
  ["address_line_2"]=>
  string(0) ""
  ["city"]=>
  string(6) "London"
  ["county"]=>
  string(0) ""
  ["postcode"]=>
  string(0) ""
  ["longitude"]=>
  string(0) ""
  ["latitude"]=>
  string(0) ""
  ["featured"]=>
  string(0) ""
  ["external_link"]=>
  string(0) ""
}

当我尝试访问$array['fund'];时,我得到Notice: Undefined index: fund。我首先想到的是fund在CSV标头中的键名中有一个隐藏字符,因为$array['name']可以工作,但是我已经检查过,唯一的隐藏字符是CR {{1} }。

我在多维数组的StackOverflow上看到了类似的问题,但对于单维数组却没有。

任何帮助将不胜感激。我什至尝试过强制转换为StdClass和LF并收到有关不存在的属性的类似错误。

我尝试将第一个标题列名称重命名为任何名称,但仍然有问题,因此我想知道访问第一个键是否有问题。

1 个答案:

答案 0 :(得分:2)

tldr;

您应该在访问$array['fund']时尝试访问$array[0]['fund']。您将其视为一维数组,但它是一个多维数组(维1,索引;维2,关联)。


说明:

您没有显示尝试访问$array['fund']的特定代码,也没有显示特定的输入,但是问题似乎是您误解了用于解析的代码的结果数组的结构。您的CSV。

array_map() + array_walk() + array_combine() + array_shift()似乎有点令人困惑,无法获得所需的结果,并且显示结果。这是“聪明”代码逐渐提高生产率的一个明显例子。与某些替代方案相比,两个衬砌阵列结构更难解析。

我将假定此输入,因为您不提供任何输入,并且读取外部文件不在此问题的范围内(并且本身并不是真正的问题):

// input

$lines = <<<EOF
fund,name,investment,region,sector,status,description,acquisition_date,size,address_line_1,address_line_2,city,county,postcode,longitude,latitude,featured,external_link
"Fund 1","Property Name","Investment Name","London","Office","Published","","","","","","London","","","","","",""
EOF;

这与您在问题中显示的数组匹配。

让我们尝试剖析以后的代码:

$array = array_map('str_getcsv', explode(PHP_EOL, $lines));

这将为您提供两个元素的数组。在索引0处具有标题,在索引1处具有值。

array_walk($array, function(&$a) use ($array) {
    $a = array_combine($array[0], $a);
});

在这里遍历这两个数组,array_combine()在索引为0的数组中遍历。您要创建一个数组,其中键是包含标头的数组中的值({{1} }。

注意:这应该使索引数组中的$array[0]显而易见,因为您已经在尝试访问位置$array上的元素。

很显然,您将获得一个额外的数组(标头数组与标头数组结合使用),但是稍后再进行处理。

0

在这里您摆脱了标头数组(标头数组为array_shift($array); 的标头)。您删除两个元素数组中的第一个元素。同样,此操作**仅在$element['fund'] = 'fund'是开头的索引数组时才有意义。

此时,您具有一个由一个元素组成的数组,并且该元素是具有18个键=>值的数组。

如果此时您尝试访问$array,它自然会失败。由于$array['fund']索引数组,而不是关联数组

您需要访问此索引数组的元素,然后尝试访问$array

例如:fund

您可以看到它在here下工作。