【问题标题】:Undefined offset while importing CSV with Laravel使用 Laravel 导入 CSV 时未定义的偏移量
【发布时间】:2019-11-19 23:35:23
【问题描述】:

情况: 数组索引是对的。 dd($row[5]) 向我显示记录中的“电子邮件地址” - 工作正常。

但是,将它 ($row[5]) 分配给对象的电子邮件字段时,Laravel 显示:ErrorException - Undefined offset: 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"
]

有什么想法吗?

【问题讨论】:

  • 我认为有些行没有索引 5。您使用 dd() 只打印第一行。

标签: php laravel


【解决方案1】:
  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);

【讨论】:

  • 我可以删除$arr []= $sub;这一行并将最后一行更改为Subscriber::insert($sub);吗?
  • @Vadim 不,这将在每个循环中插入 sql
  • 如果Subscriber::insert($sub); 在循环之外,则不应在每个循环中插入。还是我在这里遗漏了什么?
  • @Vadim 放到外面,插入array,这样会变成一个mysql查询:insert into table (email, name) values (sub1_email, sub1_name), (sub2_email, sub2_name),
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
相关资源
最近更新 更多