php - PHP如何将导入器字段映射到csv第一行字段?
问题描述
我正在将 csv 文件中的 rims 导入 webshop 项目。没什么可卖的,只是一个学习进口商如何工作的个人项目。我正在尝试将我的 $EANColumn 变量映射到我的 csv 中的第一行字段名称。
所以目前我有一个包含以下字段的csv:
EAN;品牌;...还有更多
1234-WB;WheelBrand...and-more-comming
5678-BW;BrandWheel...and-more-comming
目前在我的进口商中,当我映射时它可以工作:
$EANColumn = str_replace('’', '', $importData_arr["EAN"]);
并通过数组将其插入我的数据库:
foreach($importData_arr as $importData){
// var_dump($importData);
$insertData = array(
"EAN" =>$EANColumn);
RimsUpload::insertData($insertData);
我这部分的完整代码在这里:
if ($request->input('submit') != null ){
$file = $request->file('file');
// File Details
$filename = $file->getClientOriginalName();
$extension = $file->getClientOriginalExtension();
$tempPath = $file->getRealPath();
$fileSize = $file->getSize();
$mimeType = $file->getMimeType();
// Valid File Extensions
$valid_extension = array("csv");
// 2MB in Bytes
$maxFileSize = 2097152;
// Check file extension
if(in_array(strtolower($extension),$valid_extension)){
// Check file size
if($fileSize <= $maxFileSize){
// File upload location
$location = 'uploads';
// Upload file
$file->move($location,$filename);
// Import CSV to Database
$filepath = url($location."/".$filename);
// Reading file
$file = fopen($filepath,"r");
$importData_arr = array();
$i = 0;
while (($filedata = fgetcsv($file, 1000, ";")) !== FALSE) {
$num = count($filedata );
$EANColumn = str_replace('’', '', $importData_arr["EAN"]);
$BrandColumn = $importData_arr["Brand"];
// Skip first row (Remove below comment if you want to skip the first row)
if($i == 0){
$i++;
continue;
}
for ($c=0; $c < $num; $c++) {
$importData_arr[$i][] = $filedata [$c];
}
$i++;
}
fclose($file);
dump($importData_arr);
// Insert to MySQL database
foreach($importData_arr as $importData){
// var_dump($importData);
$insertData = array(
"EAN" =>$EANColumn,
"Brand"=>$BrandColumn,
"Name"=>$importData[2],
"Size"=>$importData[3],
"PCD"=>$importData[4],
"Offset"=>$importData[5],
"Bore"=>$importData[6],
"Color"=>$importData[7],
"Price"=>$importData[8],
"Stock"=>$importData[9],
"ImageURL"=>$importData[10]);
RimsUpload::insertData($insertData);
}
Session::flash('message','Import Successful.');
}else{
Session::flash('message','File too large. File must be less than 2MB.');
}
}else{
Session::flash('message','Invalid File Extension.');
}
}
// Redirect to index
// return redirect()->action("RimsUploadController@index", [$request]);
return response()->redirectToAction('App\Http\Controllers\RimsUploadController@index', [$request]);
}
但真正的问题是我不想映射我的列,如 [0],[1],[2],[3]... 我想从第一行列名称中获取它们:[“EAN” ],["Brand"],["Name"],["Size"]... 所以如果 EAN 是第 1 列或第 7 列,它不会有任何区别,因为它会通过名称而不是行号检测它. 因此它将能够处理具有不同列顺序的文件。
尝试执行此操作时,我收到错误消息:
Undefined index: EAN on $EANColumn = str_replace('’', '', $importData_arr["EAN"]);
重点是提供一种简单的方法,通过 csv 将供应商的数据导入 mysql。然后将其显示到网上商店网站。
解决方案
在您的 while 循环之前,从 csv 的第一行中提取字段名称:
$file = fopen($filepath,"r");
$keys = fgetcsv($file, 1000, ';');
然后,获取数据线并将$keys
数组与数据组合成一个关联数组:
$importData_arr = [];
while ($line = fgetcsv($file, 1000, ';')) {
$data = array_combine($keys, $line);
// Do something with the data
$data['EAN'] = str_replace('’', '', $data['EAN']);
$importData_arr[] = $data;
}
fclose($file);
您现在可以按名称访问所有数据字段,而与 CSV 中的顺序无关:
foreach($importData_arr as $importData){
echo $importData['EAN'];
}
只要字段名称保持不变,您就不必在字段顺序或计数更改时更改导入代码。
推荐阅读
- python - 使用 GTK 后端更改 matplotlib 导航工具栏中的图标
- python - 成员上的python类操作与静态方法
- python - Matplotlib 中“_invalidate_internal”的完成时间在较长时间内线性增加。这个函数在做什么?
- node.js - NestJS 后端是否需要实体?
- python - 改进嵌套循环搜索
- c - C不允许我写这个文件有什么原因吗?
- vector - 为什么 VectorPlot 不会产生结果?*空图*
- node.js - 如何发送推送通知以打开模式?
- php - 需要帮助在 div 上添加分页谢谢
- javascript - AJAX POST Success div 上传几秒钟后消失