访问时未定义关联数组的PHP第一个元素

时间:2019-03-11 20:07:54

标签: php arrays laravel csv

所以我在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`

0 个答案:

没有答案