質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1769閲覧

PHPでCSVインポートについて

ssk

総合スコア332

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/04/06 10:52

編集2017/04/06 13:51

CSVをインポートする際

CSV上での表示
公開 or 非公開

データベース上での表示
1 or 2

の場合、整形してからインサートすると思います。

下記でDBへインポートはできているのですが
もっと効率的な書き方はないでしょうか?

セレクトボックスとチェックボックスを正規化しているため
データベース上は数字、CSV上はテキストになっています。

CSVのデータをarray_searchで探して
該当するデータがある場合はそのidを代入するようにしています。

40項目以上、セレクトボックスorチェックボックスがあるので
ifを何行も生成しなければいけないのかな、、、と悩んでいます。

PHP

1<?php 2use App\Controller\AppController; 3use Cake\Core\Configure; 4use Cake\ORM\TableRegistry; 5use Cake\ORM\Entity; 6use Cake\Event\Event; 7use Cake\I18n\Time; 8use Cake\Core\Exception\Exception; 9 10$DatacklistsTable = TableRegistry::get('Datacklists'); 11 12$DaldataTable07 = TableRegistry::get('Daldata07s'); 13$DaldataTable09 = TableRegistry::get('Daldata09s'); 14$DaldataTable11 = TableRegistry::get('Daldata11s'); 15$DaldataTable15 = TableRegistry::get('Daldata15s'); 16$DaldataTable16 = TableRegistry::get('Daldata16s'); 17 18$DaldataTable07 = $DaldataTable07->find()->combine('dal07_id','name')->toArray(); 19$DaldataTable09 = $DaldataTable09->find()->combine('dal09_id','name')->toArray(); 20$DaldataTable11 = $DaldataTable11->find()->combine('dal11_id','name')->toArray(); 21$DaldataTable15 = $DaldataTable15->find()->combine('dal15_id','name')->toArray(); 22$DaldataTable16 = $DaldataTable16->find()->combine('dal16_id','name')->toArray(); 23 24//カラム数の判定のために利用 25$columnCnt = $DatacklistsTable->find()->contain (['Daldata11s','Daldata15s','Daldata16s'])->first()->toArray(); 26 27$header = []; 28$str = "::"; 29 30foreach ($csvfile as $row) { 31 // 空行はスキップ 32 if ($row === array(null)) { 33 continue; 34 } 35 36 if (empty($header)) { 37 for ($i = 0; $i < count($row); $i++) { 38 $row[$i] = substr($row[$i], (strpos($row[$i], $str) + strlen($str))); 39 } 40 $header = $row; 41 continue; 42 } 43 44 $data = array_combine($header, $row); 45 46 ////////////////////////////////////////////////// 47 //カラム数が異なる無効なフォーマット 48 ////////////////////////////////////////////////// 49 if (count($data) !== count($columnCnt)) { 50 throw new Exception('カラム数が不正です。'); 51 } 52 53 ////////////////////////////////////////////////// 54 //FALSEを代入しておけば 55 ////////////////////////////////////////////////// 56 $id = isset($data['id']) && $data['id'] !== '' ? $data['id'] : FALSE; 57 $dal07 = isset($data['dal07']) && $data['dal07'] !== '' ? $data['dal07'] : FALSE; 58 $dal08 = isset($data['dal08']) && $data['dal08'] !== '' ? $data['dal08'] : FALSE; 59 $dal09 = isset($data['dal09']) && $data['dal09'] !== '' ? $data['dal09'] : FALSE; 60 $dal10 = isset($data['dal10']) && $data['dal10'] !== '' ? $data['dal10'] : FALSE; 61 $dal11s = isset($data['dal11']) && $data['dal11'] !== '' ? $data['dal11'] : FALSE; 62 $dal15s = isset($data['dal15']) && $data['dal15'] !== '' ? $data['dal15'] : FALSE; 63 $dal16s = isset($data['dal16']) && $data['dal16'] !== '' ? $data['dal16'] : FALSE; 64 65 ////////////////////////////////////////////////// 66 //セレクトボックスが空白の場合は0を代入する 67 //array_searchで検索にヒットしない場合はfalseが返されて0を代入 68 ////////////////////////////////////////////////// 69 if(isset($dal07) && $dal07 !== FALSE){ 70 $dal07 = array_search($data['dal07'],$DaldataTable07); 71 if($dal07 === FALSE){ 72 $dal07 = 0; 73 } 74 }else{ 75 $dal07 = 0; 76 } 77 78 79 if(isset($dal09) && $dal09 !== FALSE){ 80 $dal09 = array_search($data['dal09'],$DaldataTable09); 81 if($dal09 === FALSE){ 82 $dal09 = 0; 83 } 84 }else{ 85 $dal09 = 0; 86 } 87 88 89 $dal07 = ['dal07' => $dal07]; 90 $dal09 = ['dal09' => $dal09]; 91 92 $saveData = array_replace($dal07,$dal09); 93 94 ////////////////////////////////////////////////// 95 //半角スペース、全角スペースがあるとarray_searchに引っかからない 96 //チェックボックスは半角・全角スペースは削除する 97 ////////////////////////////////////////////////// 98 if(isset($dal11s) && $dal11s !== FALSE){ 99 $dal11s = preg_replace("/( | )/", "", $dal11s ); 100 $dal11s = explode(';',$dal11s); 101 foreach($dal11s as $key => $value){ 102 $values = array_search($value,$DaldataTable11); 103 if($values){ 104 $ids[] = $values; 105 } 106 } 107 $saveData['daldata11s']['_ids'] = $ids; 108 }else{ 109 $saveData['daldata11s']['_ids'] = []; 110 } 111 112 if(isset($dal15s) && $dal15s !== FALSE){ 113 $dal15s = preg_replace("/( | )/", "", $dal15s ); 114 $dal15s = explode(';',$dal15s); 115 foreach($dal15s as $key => $value){ 116 $values = array_search($value,$DaldataTable15); 117 if($values){ 118 $ids[] = $values; 119 } 120 } 121 $saveData['daldata15s']['_ids'] = $ids; 122 }else{ 123 $saveData['daldata15s']['_ids'] = []; 124 } 125 126 if(isset($dal16s) && $dal16s !== FALSE){ 127 $dal16s = preg_replace("/( | )/", "", $dal16s ); 128 $dal16s = explode(';',$dal16s); 129 foreach($dal16s as $key => $value){ 130 $values = array_search($value,$DaldataTable16); 131 if($values){ 132 $ids[] = $values; 133 } 134 } 135 $saveData['daldata16s']['_ids'] = $ids; 136 }else{ 137 $saveData['daldata16s']['_ids'] = []; 138 } 139 140 ////////////////////////////////////////////////// 141 //チェックボックス配列から削除 142 //そのままでも大丈夫だけど、見た目が悪い 143 ////////////////////////////////////////////////// 144 unset($saveData['dal11']); 145 unset($saveData['dal15']); 146 unset($saveData['dal16']); 147 148 //上記で整形したデータを1件ずつ「新規作成」or「更新」 149 $result = $DatacklistsTable->findById($id)->first(); 150 if($result){ 151 //更新 152 $datacklist = $DatacklistsTable->get($id, ['contain' => ['Daldata11s','Daldata15s','Daldata16s']]); 153 $datacklist = $DatacklistsTable->patchEntity($datacklist,$saveData,['associated' => ['Daldata11s','Daldata15s','Daldata16s']]); 154 //debug($datacklist); 155 if(!$datacklist->errors()){ 156 $importResult = $DatacklistsTable->save($datacklist); 157 if($importResult){ 158 $this->Flash->set($importResult->id.'.'.$importResult->dal02.' 更新', []); 159 } 160 }else{ 161 $this->Flash->set($id.'.'.$datacklist->dal02.' 失敗', []); 162 } 163 }else{ 164 //新規追加 165 $datacklist = $DatacklistsTable->newEntity($saveData,['associated' => ['Daldata11s','Daldata15s','Daldata16s']]); 166 if(!$datacklist->errors()){ 167 $importResult = $DatacklistsTable->save($datacklist); 168 if($importResult){ 169 $this->Flash->set($importResult->id.'.'.$importResult->dal02.' 新規追加', []); 170 } 171 }else{ 172 $this->Flash->set($id.'.'.$datacklist->dal02.' 失敗', []); 173 } 174 } 175} 176 177$DatacklistsTable->connection()->commit(); 178?>

###追記

PHP

1$saveData['daltada11s']['_ids'] = $this->Functions->_searchCheckBox($dal11s,$data,'daldata11s',$DaldataTable11); 2$saveData['daltada15s']['_ids'] = $this->Functions->_searchCheckBox($dal15s,$data,'daldata15s',$DaldataTable15); 3$saveData['daltada16s']['_ids'] = $this->Functions->_searchCheckBox($dal16s,$data,'daldata16s',$DaldataTable16);

PHP

1public function _searchCheckBox($values,$datas,$key,$table){ 2 if(isset($values) && $values !== FALSE){ 3 ////////////////////////////////////////////////// 4 //半角スペース、全角スペースがあるとarray_searchに引っかからない 5 //チェックボックスは半角・全角スペースは削除する 6 ////////////////////////////////////////////////// 7 $values = preg_replace("/( | )/", "", $values); 8 $values = explode(';',$values); 9 10 foreach($values as $key => $value){ 11 $values = array_search($value,$table); 12 if($values){ 13 $ids[] = $values; 14 } 15 } 16 $values = $ids; 17 }else{ 18 $values = []; 19 } 20 return $values; 21 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

きれいに書けていますね。ただ、以下の2点を改善すれば更に効率的な書き方になると思います。

  1. 処理が冗長です。同じ処理はまとめましょう。全体の流れが分かりにくいです。
  2. CSVデータが具体的にどのようなものか分からないので、どのような処理をすべきか検討できません。人に見せるときはデータについて説明しましょう。話は少しずれますが、下記の参考サイトに目を通すとためになります。

(参考:最低限書いておきたいPHPのDocコメント
(参考:phpDocumentor

【1.の例】

PHP

1// 同じ処理をしている 2 if(isset($dal07) && $dal07 !== FALSE){ 3 $dal07 = array_search($data['dal07'],$DaldataTable07); 4 if($dal07 === FALSE){ 5 $dal07 = 0; 6 } 7 }else{ 8 $dal07 = 0; 9 } 10 11 12 if(isset($dal09) && $dal09 !== FALSE){ 13 $dal09 = array_search($data['dal09'],$DaldataTable09); 14 if($dal09 === FALSE){ 15 $dal09 = 0; 16 } 17 }else{ 18 $dal09 = 0; 19 }

↓↓↓↓↓↓

PHP

1// まとめる 2public function _hoge($dal,$data,$key,$DaldataTable) 3{ 4 if(isset($dal) && $dal !== FALSE){ 5 $dal = array_search($data[$key],$DaldataTable); 6 if($dal === FALSE){ 7 $dal = 0; 8 } 9 }else{ 10 $dal = 0; 11 } 12 return $dal; 13} 14 15public function main() 16{ 17 $dal07 = $this->_hoge($dal07,$data,'dal07',$DaldataTable07) 18 $dal09 = $this->_hoge($dal09,$data,'dal09',$DaldataTable09) 19}

投稿2017/04/06 11:57

coba-coba

総合スコア1409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssk

2017/04/06 13:40

ありがとうございます。 $dal07 = $this->_hoge($dal07,$data,'dal07',$DaldataTable07) ↑こちらを参考に処理をまとめることができました。 下記の処理はまとめることはできますか? returnの処理が配列になるため、悩んでいます。。 if(isset($dal11s) && $dal11s !== FALSE){ $dal11s = preg_replace("/( | )/", "", $dal11s ); $dal11s = explode(';',$dal11s); foreach($dal11s as $key => $value){ $values = array_search($value,$DaldataTable11); if($values){ $ids[] = $values; } } $saveData['daldata11s']['_ids'] = $ids; }else{ $saveData['daldata11s']['_ids'] = []; }
ssk

2017/04/06 13:52

チェックボックスfunctionを追記しました。 どうでしょう、、、助言いただければ幸いです。
coba-coba

2017/04/06 15:10

考え方は合っています。 変数の対応関係やreturnするものを再度確認してください。
ssk

2017/04/06 15:48

ありがとうございます! 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問