所以我在CSV上传和访问数组属性方面遇到了一个非常奇怪的问题。我的上传使用以下逻辑成功创建了一个数组数组:
try {
$handle = fopen($this->request->file("csv"), "r");
$header = null;
$data = [];
while(($row = fgetcsv($handle, 1000, ",")) != false){
if(!$header){
$header = $row;
} else {
// $array = [];
// for($i = 0; $i < count($header); $i++){
// $array[$header[$i]] = $row[$i];
// }
// $data[] = $array;
$data[] = array_combine($header, $row);
}
}
fclose($handle);
} catch(\Exception $ex){
session()->flash("error", "Error uploading or parsing CSV: ".$ex->getMessage().". Please contact support.");
return back()->withInput();
}
注意:注释掉的方法是构造键/值对的另一种方法,其中标头是行:
review,first_name,last_name,rating,city,province_code,service_code
说完一切,运行dd($data)
时得到以下信息:
array (1231) [
0 => [
"review" => "This is a Review"
"first_name" => "Bob"
"last_name" => "Smith"
"rating" => "5"
"city" => "Toronto"
"province_code" => "ON"
"service_code" => "EXAMPLE"
], 1 => [...]
]
看看这些键,我应该能够毫无问题地访问$array["review"]
(在循环内),但是在循环的第一次迭代中我总是遇到Undefined index
错误:
try {
foreach($data AS $index => $array){
$model = new Model();
$model->review = trim($array["review"]);
...
}
} catch(\Exception $ex){
\Log::info("Error in function: ".$ex->getMessage()." in ".$ex->getFile()." at line ".$ex->getLine());
dd($array, $index);
...
}
注意:错误处理程序中的dd($array, $index)
打印上述数组中的第一个元素,并打印0
,表示此循环的第一次迭代。实际错误是:
ErrorException {#789▼ #message:“未定义索引:评论” #代码:0 严重性:E_NOTICE -trace:数组:65 [▶] }
恼人的是,我可以毫无问题地访问$array["first_name"]
和所有其他属性。同样,问题似乎出在csv
文件中定义的数组首位键上。例如,如果我在reviews.csv
之前的review
中添加另一列,我们称其为something
,那么我无法访问$array["something"]
,但我可以访问$array["review"]
以前有没有人看过这个问题?这是fgetcsv
的怪异副产品吗? 我应该尝试转换为对象并使用对象访问语法吗?例如 $object->review
?
编辑:对象语法存在相同问题:
$data[] = (object)array_combine($header, $row);
...
dd($data[0]->review); // Throws `Undefined property: stdClass::$review`
dd($data[0]->first_name); // Prints out "Bob"
编辑: CSV的第一列似乎是一个进一步的问题。我可以使用注释掉的方法添加一个手动专栏,并且可以毫无问题地访问它:
$array = [
"temp" => "test"
];
for($i = 0; $i < count($header); $i++){
$array[$header[$i]] = $row[$i];
}
$data[] = $array;
...
dd($data[0]["temp"]); // Prints "test"
dd($data[0]["review"); // Prints `Undefined index: review`