使用Laravel导入CSV时未定义的偏移量



情况:数组索引是正确的。dd($row[5](显示了记录中的"电子邮件地址"-工作正常。

然而,当将其分配给对象的电子邮件字段时,Laravel显示:ErrorException-未定义的偏移量:5

这是我的代码:

$file = $request->file('file');
$csvData = file_get_contents($file);
$rows = array_map('str_getcsv', explode("n", $csvData));
foreach ($rows as $row) {
//dd($row[5]); // shows me email
$subscriber = new Subscriber;
$subscriber->email = $row[5]; // Shows: ErrorException - Undefined offset: 5
$subscriber->first_name = $row[3];
$subscriber->save();
}

这是ddd($row(

array:7 [▼
0 => "1"
1 => "2019-02-27 01:01:52"
2 => "mailchimp"
3 => "Name"
4 => "Lastname"
5 => "fake-subscriber@gmail.com"
6 => "EN"
]

有什么想法吗?

  1. dd()将打印消息。和exit(),所以您只需在第一个循环打印即可。它可以在第二个循环中没有索引5。

  2. 不要在每个循环中save()条记录,这会在数据库中花费更多的成本时间;尝试将它们放入数组中,然后立即插入。

  3. 如果您不想在没有电子邮件的情况下保存这些记录,只需检查行,不要将其放入数组中。

PS:如果您想在一条记录失败时回滚,请尝试使用transaction

你的代码应该是这样的:

$file = $request->file('file');
$csvData = file_get_contents($file);
$rows = array_map('str_getcsv', explode("n", $csvData));
$arr = array();
// dd($row)  // Here you can see the rows which without index 5.
foreach ($rows as $row) {
$sub = [];
$sub['email'] = isset($row[5])? $row[5]: ''; 
$sub['first_name'] = isset($row[3])? $row[3]: '';
$arr []= $sub;
}
Subscriber::insert($arr);

$arr = array();
foreach ($rows as $row) {
$sub = [];
if (count($row) > 5) {
$sub['email'] = $row[5]; 
$sub['first_name'] = $row[3];
$arr []= $sub;
}
}
Subscriber::insert($arr);

最新更新