PHP如何将导入器字段映射到csv第一行字段?

PHP如何将导入器字段映射到csv第一行字段?,php,data-import,Php,Data Import,我正在将rims从csv文件导入webshop项目。没有什么可卖的,只是一个学习进口商如何工作的个人项目。 我正在尝试将$EANColumn变量映射到csv中的第一行字段名 因此,目前我有一个包含以下字段的csv: EAN;品牌;。。。还有更多的承诺 1234-WB;WheelBrand…还有更多承诺 5678-BW;BrandWheel…还有更多 目前,在我的导入程序中,当我映射以下内容时,它会起作用: $EANColumn = str_replace('’', '', $imp

我正在将rims从csv文件导入webshop项目。没有什么可卖的,只是一个学习进口商如何工作的个人项目。 我正在尝试将$EANColumn变量映射到csv中的第一行字段名

因此,目前我有一个包含以下字段的csv:

EAN;品牌;。。。还有更多的承诺


1234-WB;WheelBrand…还有更多承诺


5678-BW;BrandWheel…还有更多


目前,在我的导入程序中,当我映射以下内容时,它会起作用:

$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]);
  }
if($request->input('submit')!=null){
$file=$request->file('file');
//文件详细信息
$filename=$file->getClientOriginalName();
$extension=$file->getClientOriginalExtension();
$tempPath=$file->getRealPath();
$fileSize=$file->getSize();
$mimeType=$file->getMimeType();
//有效的文件扩展名
$valid_extension=数组(“csv”);
//2MB字节
$maxFileSize=2097152;
//检查文件扩展名
if(在数组中(strtolower($extension),$valid_extension)){
//检查文件大小
如果($fileSize-move($location,$filename);
//将CSV导入数据库
$filepath=url($location.“/”$filename);
//读取文件
$file=fopen($filepath,“r”);
$importData_arr=array();
$i=0;
while(($filedata=fgetcsv($file,1000,“;”))!==FALSE){
$num=计数($filedata);
$EANColumn=str_replace(“”,“”,$importData_arr[“EAN”);
$BrandColumn=$importData_arr[“品牌”];
//跳过第一行(如果要跳过第一行,请删除下面的注释)
如果($i==0){
$i++;
继续;
}
对于($c=0;$c<$num;$c++){
$importData_arr[$i][=$filedata[$c];
}
$i++;
}
fclose($文件);
转储($importData_arr);
//插入到MySQL数据库
foreach($importData\u arr as$importData){
//变量转储($importData);
$insertData=数组(
“EAN”=>$EAN列,
“品牌”=>$BrandColumn,
“Name”=>$importData[2],
“大小”=>$importData[3],
“PCD”=>$importData[4],
“偏移量”=>$importData[5],
“孔”=>$importData[6],
“颜色”=>$importData[7],
“价格”=>$importData[8],
“库存”=>$importData[9],
“ImageURL”=>$importData[10]);
RimsUpload::insertData($insertData);
}
会话::flash('消息','导入成功');
}否则{
会话::闪存(“消息”,“文件太大。文件必须小于2MB”);
}
}否则{
会话::flash('消息','文件扩展名无效');
}
}
//重定向到索引
//返回重定向()->操作(“RimsUploadController@index“,[$请求];
return response()->redirectToAction('App\Http\Controllers\RimsUploadController@index“,[$request]);
}
但真正的问题是我不想映射像[0]、[1]、[2]、[3]这样的列。。。 我想从第一排列的名称中选取它们:[“EAN”],[“Brand”],[“name”],[“Size”]。。。 所以,如果EAN是第1列或第7列,它不会有什么区别,因为它将通过名称而不是行号来检测它。 因此,它将能够处理具有不同列顺序的文件

尝试执行此操作时,我得到错误:
未定义索引:EAN on$EANColumn=str_replace(“”,“”,$importData_arr[“EAN”);


整个要点是通过csv将供应商的数据导入mysql,然后将其显示到webshop站点。

下面是一些简单的建议,如何将数据映射到具有给定密钥的数组

while ($row = fgetcsv($fp, 100, ',')) {

      $columnName = ['a','b','c','d','e','f'];
      $myRow = array_combine($columnName,$row);
    ....
 

在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'];
}

只要字段名保持不变,当字段顺序或计数发生变化时,您就不必更改导入代码。

在输入数据中,它不是数字索引键吗?您可以将$importData\u arr转储吗?只需创建一个映射器类,在该类中您可以将行映射到其相关名称,您还可以应用一些出于您的目的(myMapperClass->getValuesByBrandName(mybrandname)或任何您想要的东西)需要Logic。@Jerson数组(0){@ChristianFelix我不知道你这是什么意思,你能告诉我吗?即使在一个类中做了我所做的事情。它仍然会返回未定义索引的错误当你不打算应用特殊逻辑时,只使用这个:$test=['a','b','c','d','e','f'];$result=array\u combine($test,$row);现在您的数组有一个与value@Michael阿格霍姆:我的第一稿有一个bug,已经修复了!为什么我还需要定义偏移量“$importData_arr[0]”还有。这是一个非常好的解决方案,我添加了这个。一切似乎都很好,但我得到了错误:未定义的偏移量:8。添加10列时。我已仔细检查,没有错误,但不会高于7。有什么想法吗?@Michael Aggerholm:在我的第一个示例中,我跳过了
foreach
,因此必须为ac指定偏移量访问一个元素-查看我的更新答案,在代码中使用
foreach
类循环。@Michael Aggerholm:要解决第二个问题,只需通过
var_dump
”逐行调试
fgetcsv
,CSV文件中可能存在某种错误