如何解决Laravel 导入器给出未定义的索引异常
我正在创建一个带有 GUI 的 Laravel 导入器。 所以,我有一个“ParseImport”功能:
public function parseImport(CsvImportRequest $request)
{
$path = $request->file('csv_file')->getRealPath();
if ($request->has('header')) {
$data = Excel::toArray([],request()->file('csv_file'))[0];
} else {
$data = array_map('str_getcsv',file($path));
}
if (count($data) > 0) {
if ($request->has('header')) {
$csv_header_fields = [];
foreach ($data[0] as $key => $value) {
$csv_header_fields[] = $key;
}
}
$csv_data = array_slice($data,2);
$csv_data_file = CsvData::create([
'csv_filename' => $request->file('csv_file')->getClientOriginalName(),'csv_header' => $request->has('header'),'csv_data' => json_encode($data)
]);
} else {
return redirect()->back();
}
return view('import_fields',compact( 'csv_header_fields','csv_data','csv_data_file'));
}
还有一个“ProcessImport”:
public function processImport(Request $request)
{
$data = CsvData::find($request->csv_data_file_id);
$csv_data = json_decode($data->csv_data,true);
foreach ($csv_data as $row) {
$item = new Item();
var_dump($item);
foreach (config('app.db_fields') as $index => $field) {
if ($data->csv_header) {
$item->$field = $row[$request->fields[$field]];
} else {
$item->$field = $row[$request->fields[$index]];
}
}
$item->save();
}
return view('import_success');
}
并在我的 GUI 中选择匹配的字段,从我的 import_fields.blade.PHP 中:
<form class="form-horizontal" method="POST" action="{{ route('import_process') }}">
{{ csrf_field() }}
<input type="hidden" name="csv_data_file_id" value="{{ $csv_data_file->id }}" />
<table class="table">
@if (isset($csv_header_fields))
<tr>
@foreach ($csv_header_fields as $csv_header_field)
<th>{{ $csv_header_field }}</th>
@endforeach
</tr>
@endif
@foreach ($csv_data as $row)
<tr>
@foreach ($row as $key => $value)
<td>{{ $value }}</td>
@endforeach
</tr>
@endforeach
<tr>
@foreach ($csv_data[0] as $key => $value)
<td>
<select name="fields[{{ $key }}]">
@foreach (config('app.db_fields') as $db_field)
<option value="{{ (\Request::has('header')) ? $db_field : $loop->index }}"
@if ($key === $db_field) selected @endif>{{ $db_field }}</option>
@endforeach
</select>
</td>
@endforeach
</tr>
</table>
<button type="submit" class="btn btn-primary">
Import Data
</button>
</form>
到我的数据库表 csv_data 中,我在其中存储 csv 文件和数据。它工作正常,数据按原样存储:
但是当尝试将文件导入我的项目表时:
Var_dump($item) 给了我以下内容:
{ ["fillable"]=> array(13) {
[0]=> string(5) "title"
[1]=> string(11) "item_number"
[2]=> string(3) "ean"
[3]=> string(6) "active"
[4]=> string(5) "price"
[5]=> string(10) "cost_price"
[6]=> string(11) "offer_price"
[7]=> string(6) "teaser"
[8]=> string(11) "description"
[9]=> string(9) "inventory"
[10]=> string(5) "image"
[11]=> string(8) "brand_id"
[12]=> string(11) "category_id" }
你们能看到我遗漏了什么吗?我似乎无法理解它。
解决方法
你的方法太复杂了。我在谷歌上搜索了“php csv to associative array”并找到了这段代码,看起来很清楚。
$csv = array_map('str_getcsv',file($file));
array_walk($csv,function(&$a) use ($csv) {
$a = array_combine($csv[0],$a);
});
array_shift($csv);
https://medium.com/@czmole/php-convert-csv-to-associative-arrays-b82b9b4d4412
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。