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

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

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

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

PHP

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

Q&A

解決済

1回答

1149閲覧

PHPでCSVから同じ注文番号を持つ行の内容を抽出したい

goun

総合スコア11

CSV

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

PHP

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

0グッド

0クリップ

投稿2019/03/18 05:40

編集2019/03/18 06:54

前提

以下のようなCSVがあります。

"注文番号","商品名","個数","金額","備考","注文金額合計" "1","みかん","5","75","固くてもいいです","1175" "1","りんご","3","100","虫がいないか確かめて下さい","1175" "1","いちご","10","50","熟していないのをください","1175" "2","メロン","1","1000","甘いやつ","1000" "3","りんご","5","100","できるだけ渋いのを","1000" "3","いちご","10","50","小さめで","1000" "4","りんご","10","100","やわらかいのをください","1000" "5","みかん","30","75","すっぱいの","2250" "6","りんご","3","100","青りんご以外","300" "7","りんご","10","100","サン富士に似たのがほしい","7225" "7","いちご","100","50","きれいなかたちのを","7225" "7","みかん","3","75","大きいのだとうれしいです","7225" "7","メロン","1","1000","網が少ないのをください","7225" "8","みかん","5","75","冷凍みかん向け","2625" "8","みかん","30","75","腐ってないか確認して下さい","2625"

やりたいこと

PHPで注文番号「3」のものだけを、
"注文番号","商品名1","個数1","金額1","備考1","商品名2","個数2","金額2","備考2","商品名3","個数3","金額3","備考3","商品名4","個数4","金額4","備考4","注文金額合計"
という形式のデータにしたいのですが、どうしたらよいでしょうか。

やったこと

HTML

1<html> 2<body> 3<form action="sample.php" method="post" enctype="multipart/form-data"> 4 CSVファイル: <input type="file" name="csvfile" size="30" /> <input type="submit" value="アップロード" /> 5</form> 6</body> 7</html>

PHP

1<?php 2 3// CSV読み込み 4if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) { 5 $file_tmp_name = $_FILES["csvfile"]["tmp_name"]; 6 $file_name = $_FILES["csvfile"]["name"]; 7 8 //拡張子を判定 9 if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv') { 10 $err_msg = 'CSVファイルのみ対応しています。'; 11 } else { 12 //ファイルをdataディレクトリに移動 13 if (move_uploaded_file($file_tmp_name, "../../../temp/uploaded/" . $file_name)) { 14 //後で削除できるように権限を644に 15 chmod("../../../temp/uploaded/" . $file_name, 0644); 16 $msg = $file_name . "をアップロードしました。"; 17 $file = '../../../temp/uploaded/'.$file_name; 18 $fp = fopen($file, "r"); 19 //配列に変換する 20 while (($data = fgetcsv($fp, 0, ",")) !== FALSE) { 21 $asins[] = $data; 22 } 23 24 mb_convert_variables('UTF-8','SJIS',$asins); 25 fclose($fp); 26 //ファイルの削除 27 unlink('../../../temp/uploaded/'.$file_name); 28 } else { 29 $err_msg = "ファイルをアップロードできません。"; 30 } 31 } 32} else { 33 $err_msg = "ファイルが選択されていません。"; 34} 35 36$order = array($asins[6][0],$asins[6][1],$asins[6][2],$asins[6][3],$asins[6][4],$asins[6][5]); 37echo $order[0] . "" . $order[1] . " " . $order[2] . " " . $order[3] . " " . $order[4] . " " . $order[5]; 38 39?>

CSVを取り込み、指定した行を取り出すところまではできたのですが、この先、同じ注文番号を持つ他の行を統合して、以下のような結果を得るためにどのように考えたら良いのか悩んでおります。

"3","りんご","5","100","できるだけ渋いのを","いちご","10","50","小さめで","","","","","","","","1000"

よろしくお願いします。

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

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

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

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

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

m.ts10806

2019/03/18 05:44

「表を作り直す」とはどのようなアウトプットを想定されているのでしょうか。 せめて取り込んで表示しているところ、現在のコードを提示いただけませんか?
goun

2019/03/18 06:41

大変失礼しました。現在のコードを追記しました。 やりたいことは、注文番号ごとに注文の内容をまとめたいということです。 1行目、3行目など指定した行のデータの取り込み方はわかったのですが、「同じ注文番号を持つ他の行のデータをひとつにまとめる」ためにどうしたらいいのか悩んでおります。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

概念だけですが。対象だけのリストを先に作ってループさせる感じです。

PHP

1 2$target_order_id = 3; 3$total_price = 0; 4 5$upload_list = ここにアップロードされたCSVデータをいい感じに配列で格納 6 7$target_list = array(); 8foreach ($upload_list as $line) { 9 if ($line['order_id'] == $target_order_id) { 10 $target_list[] = $line; 11 } 12} 13 14$header = "注文番号"; 15foreach ($i = 1; $i <= count($target_list); $i++) { 16 $header .= ",商品名{$i},個数{$i},金額{$i},備考{$i}"; 17} 18$header .= ",注文金額合計"; 19 20$data = $target_order_id; 21foreach ($target_list as $line) { 22 $data .= ",{$line['name']},{$line['amount']},{$line['price']},{$line['remark']}"; 23 $total_price += $line['total_price']; 24} 25$data .= ",{$total_price}";

投稿2019/03/18 07:12

tabuu

総合スコア2449

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

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

goun

2019/03/19 02:02

<?php // CSV読み込み if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) { $file_tmp_name = $_FILES["csvfile"]["tmp_name"]; $file_name = $_FILES["csvfile"]["name"]; //拡張子を判定 if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv') { $err_msg = 'CSVファイルのみ対応しています。'; } else { //ファイルをdataディレクトリに移動 if (move_uploaded_file($file_tmp_name, "../../../temp/uploaded/" . $file_name)) { //後で削除できるように権限を644に chmod("../../../temp/uploaded/" . $file_name, 0644); $msg = $file_name . "をアップロードしました。"; $file = '../../../temp/uploaded/'.$file_name; $fp = fopen($file, "r"); //配列に変換する while (($data = fgetcsv($fp, 0, ",")) !== FALSE) { $upload_list[] = $data; } mb_convert_variables('UTF-8','SJIS',$asins); fclose($fp); //ファイルの削除 unlink('../../../temp/uploaded/'.$file_name); } else { $err_msg = "ファイルをアップロードできません。"; } } } else { $err_msg = "ファイルが選択されていません。"; } $target_order_id = 3; $total_price = 0; $target_list = array(); foreach ($upload_list as $line) { if ($line[0] == $target_order_id) { $target_list[] = $line; } } $data = $target_order_id; foreach ($target_list as $line) { $data .= ",{$line['1']},{$line['2']},{$line['3']},{$line['4']}"; $total_price += $line['5']; } $data .= ",{$total_price}"; echo $data; ?>
goun

2019/03/19 02:03

ありがとうございます!これで理想の結果が得られました。 考え方の基本がわかったので、このまま目的のものが完成できそうです。 非常に助かりました。感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問