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

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

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

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

Q&A

解決済

2回答

3271閲覧

PHPでcsvファイルの中を合計!

yoshi94047404

総合スコア13

PHP

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

0グッド

0クリップ

投稿2019/03/11 03:19

前提・実現したいこと

PHPで下記のようなcsvファイルを読み込ませ、
月(month)ごと+店舗(store)ごとの合計を計算し、
表形式で出したいです。
ちなみにこのフィルはtest.csvと名付け保存しました。

month,store,count,sales 1月,A,123,345 2月,B,23,67 1月,B,111,765 3月,B,435,1234 2月,A,341,987 1月,B,453,900 1月,A,231,700 2月,B,122,499 2月,A,567,1345 3月,A,879,2300

###エラー

Invalid argument supplied for foreach() in test.php on line 36 Warning: Invalid argument supplied for foreach() in test.php on line 82

該当のソースコード

<?php $arrShopSales = array(); foreach ($arrMonth as $month) { foreach ($arrShop as $shop) { $shopSale = [ 'month' => $month, 'shop' => $shop ]; foreach ($arrCol as $col) { $shopSale[$col] = 0; } $arrShopSales[] = $shopSale; } } $file = new SplFileObject('test.csv'); $file->setFlags(SplFileObject::READ_CSV); foreach($file as $res) { if ($res[0] === null) continue; $month = $res[0]; $place = $res[1]; foreach($arrShopSales as $index => $shopSale) { if ($month === $shopSale['month'] && $place === $shopSale['shop']) { $arrShopSales[$index]['product_count'] += $res[2]; $arrShopSales[$index]['sales'] += $res[3]; } } } ?> <table border="1"> <tr> <th>月</th> <th>店舗</th> <th>売上商品数</th> <th>売上(千円)</th> </tr> <?php foreach($arrShopSales as $month => $shopSaleData); ?> <tr> <td rowspan="2"> <?php echo $month; ?> </td> <?php foreach($shopSaleData as $shop => $sale); ?> <td> <?php echo $shop; ?> </td> <td> <?php echo $sale['product_count']; ?> </td> <td> <?php echo $sale['sales']; ?> </td> </tr> </table>

試したこと

上記のように書きましたが、どこが間違えたかがわかりません。
もし、もっとわかりやすい書き方などがありましたら、教えて頂けませんか。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

エラーで出ている行数と提示されたコードの行数が合わないように思います。
省略されたのでしたらそれが分かるようにしていただければと思います。

いずれにしてもforeachで扱えない変数がきているようなので、当該foreachにセットしている変数について、その前までで、情報がきちんと取得できているか確認してください(var_dump()など)

投稿2019/03/11 03:24

m.ts10806

総合スコア80850

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

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

0

ベストアンサー

変数の誤記などがあったので、全部書き換えしました。
質問者様のコメントは、foreachの行の最後が:ではなく;になっているため、foreachの中で何もしないことにされており、htmlのテーブルがループせずに、foreachの最後の値だけが出力されていた、という現象だと思います。

php

1<?php 2$arrShopSales = []; 3$months = ["1月","2月","3月",]; 4$shops = ["A", "B"]; 5//↓こう作って 6foreach($months as $month) { 7 foreach($shops as $shop) { 8 $arrShopSales[$month][$shop] = ["product_count"=>0, "sales"=>0]; 9 } 10} 11 12 13$file =<<<EOF 141月,A,123,345 152月,B,23,67 161月,B,111,765 173月,B,435,1234 182月,A,341,987 191月,B,453,900 201月,A,231,700 212月,B,122,499 222月,A,567,1345 233月,A,879,2300 24EOF; 25$file = explode("\n", $file); 26 27//↓こう使う 28foreach($file as $res) { 29 $res = explode(",", $res); 30 if ($res[0] === null) continue; 31 $month = $res[0]; 32 $place = $res[1]; 33 34 $arrShopSales[$month][$place]['product_count'] += $res[2]; 35 $arrShopSales[$month][$place]['sales'] += $res[3]; 36} 37?> 38 39<table border="1"> 40 <tr> 41 <th></th> 42 <th>店舗</th> 43 <th>売上商品数</th> 44 <th>売上(千円)</th> 45 </tr> 46 <?php foreach($arrShopSales as $month => $shopSaleData): ?> 47 <tr> 48 <td rowspan="2"> 49 <?php echo $month; ?> 50 </td> 51 <?php foreach($shopSaleData as $shop => $sale): ?> 52 <td> 53 <?php echo $shop; ?> 54 </td> 55 <td> 56 <?php echo $sale['product_count']; ?> 57 </td> 58 <td> 59 <?php echo $sale['sales']; ?> 60 </td> 61 </tr> 62 <?php endforeach;?> 63 <?php endforeach;?> 64</table>

投稿2019/03/11 03:57

編集2019/03/11 05:34
papinianus

総合スコア12705

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

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

yoshi94047404

2019/03/11 04:19

丁寧に書いていただいて、ありがとうございます。 実行してみたところ、確かに合計はでますが、なぜか 3月|B|1314 | 3534 と 月ごと、店舗ごとの合計ではなく、3月のA+Bのデータのみが 表示されました。もしよければ、htmlのところもどう直せば 良いのかアドバイスをしていただけますでしょうか。 お定数おかけします。
papinianus

2019/03/11 05:34

$shopにしていましたが、$placeでした。色々間違っていたので書き換えました。
yoshi94047404

2019/03/11 07:18

こちらこそ、お手数おかけしまして、申し訳ありませんでした。 とても良い勉強になりました。書いていただいたコードをもう一度みて 改めて勉強させていただきます。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問