お世話になっています。
PHPでのCSVインポート機能で、値を配列で取得する方法について質問させて頂きます。
現在CSVをインポートしてuserテーブルに保存する機能を実装しているのですが、
ヘッダー部分のカラム名とヘッダー部以外のユーザー情報をforeachで回して取得したいという状況です。
具体的には、以下のコードはカラム名を指定して値を取得していますがカラム名もCSVの
ヘッダー部分から取得したいと思っています。
PHP
1 $user = array( 2 'user_id' => $row[0], 3 'account_name' => $row[1], 4 'account_type' => $row[2], 5 ); 6 return $user; 7 }
以下が現在実装しているコードです。
PHP
1 public function upload(Request $request) 2 { 3 $csv_file = $request->file('file'); 4 5 // Goodby CSVの設定 6 $config_in = new LexerConfig(); 7 $config_in 8 ->setDelimiter(",") 9 ->setFromCharset("SJIS-win") 10 ->setToCharset("UTF-8") 11 ; 12 13 $lexer_in = new Lexer($config_in); 14 15 16 $data = array(); 17 18 $interpreter = new Interpreter(); 19 $interpreter->addObserver(function (array $rows) use (&$datalist) { 20 // 各列のデータを取得 21 $data[] = $rows; 22 }); 23 24 // CSVデータをパース 25 $lexer_in->parse($csv_file, $interpreter); 26 27 // TMPファイル削除 28 unlink($csv_file); 29 30 $csv_header = $data[0]; 31 $csv_body = array_splice($data, 1); 32 33 foreach($csv_body as $rows){ 34 // 各データ取り出し 35 $csv_user = $this->get_csv_user($rows,$csv_header); 36 37 // DBへの登録 38 $this->register_user_csv($csv_user); 39 } 40 41 return view('/upload_complete'); 42 } 43 } 44 45 private function get_csv_user($rows,$csv_header) 46 { 47 foreach ($rows as $row) { 48 $user = new User(); 49 foreach ($row as $key => $value) { 50 $csv_header[$key]->$row[$key]; 51 } 52 53 } 54 return $user; 55 } 56 57 private function register_user_csv($user) 58 { 59 $new_user = new User; 60 foreach($user as $key => $value){ 61 $new_user->$key = $value; 62 } 63 $new_user->save(); 64 } 65 66}
この実装で現在エラーが出ている状態です。
「$csv_user = $this->get_csv_user($rows,$csv_header);」の時点で$rowsにユーザーのデータ、
$csv_headerにヘッダーのカラム情報が入っていることは確認できています。
また、具体例として提示したコードを用いた場合正常にUserテーブルにインポートできることも
確認できている状態です。
かなし初歩的な内容ではあるかと思いますがご教示頂けると幸いです。
よろしくお願い致します。
追記
エラーの内容は以下の通りです。
「Invalid argument supplied for foreach()」
get_csv_userメソッドの「foreach ($row as $key => $value)」部分で起きているエラーでした。
情報が足りず失礼致しました。
回答3件
あなたの回答
tips
プレビュー