我有一个使用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);
返回的$array
从var_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
并收到有关不存在的属性的类似错误。
我尝试将第一个标题列名称重命名为任何名称,但仍然有问题,因此我想知道访问第一个键是否有问题。
答案 0 :(得分:2)
您应该在访问$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下工作。