【问题标题】:Laravel importer giving Undefined index exceptionLaravel 进口商给出未定义的索引异常
【发布时间】:2021-03-27 07:00:47
【问题描述】:

我正在创建一个带有 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, 0, 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');
    }

上传我的 csv 文件时:

并从我的 import_fields.blade.php 中选择我的 GUI 中的匹配字段:

<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" } 

你们中的任何人都可以看到我缺少什么吗?我似乎无法理解它。

【问题讨论】:

  • 这意味着 $row 没有标题。 var_dump($row) 查看数据是什么。
  • Var_dump($row) 向我抛出这个: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" } - 据我所知,标题是我的第一个索引。
  • 所以这显示了标题。从数组中删除这一行,然后重试。这次你会得到第一行没有任何key的数据。
  • @BülentAkgül 我不确定你的意思是什么,你能解释一下要删除的位置和内容吗?对不起。
  • 在下面查看我的答案。

标签: php mysql laravel


【解决方案1】:

你的方法太复杂了。我用谷歌搜索了“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

【讨论】:

  • 我无法让它工作,我正在使用这种方法,因为它应该能够从 gui 的下拉列表中专门设置的标题中进行选择。我看不出我应该如何在不丢失功能的情况下将我的代码重构为类似的东西?也许你可以给我看?我很想看看它,如果它实际上能给我一个类似的结果
猜你喜欢
  • 2010-11-16
  • 2018-08-02
  • 2012-08-24
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多