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

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

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

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

Q&A

解決済

1回答

297閲覧

「2つのCSVファイルを合体した表」にある値から、そのカラムの合計値を求めたい

tajix_japan

総合スコア132

PHP

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

0グッド

0クリップ

投稿2020/03/01 01:21

編集2020/03/01 01:23

2つのCSVファイルの合体の合計値を求めたい

下記のようなファイルがあります

ユーザー名ファイル(タブ区切りCSVファイル) = 1001はユーザーIDとなります。

1001.csv
ユーザー 銘柄   銘柄コード 保有株数
1001 トヨタ自動車 7203  500
1001 武田薬品工業 4502  300
1001 ソニー    6758  100

stock_price.csv
銘柄    銘柄コード 株価
コマツ    6301  2182
トヨタ自動車 7203  7127
ホンダ    7267  2799
キャノン   7751  2733
武田薬品工業 4502  3763
みずほFG    8411 147
ソニー    6758  6611

上記のCSVファイルを合体して、さらに資産状況まで分かるPHPを組みました。

ユーザー 銘柄   銘柄コード 保有株数 株価  資産価値
1001 トヨタ自動車  7203  500 7127 3563500
1001 武田薬品工業 4502  300 3763 1128900
1001 ソニー    6758  100 6758 675800

それが下記のPHPです。

php

1 2<?php 3 4$ai2=htmlspecialchars($_GET['ai2'], ENT_QUOTES, "UTF-8"); 5 6$user_filepath ="./usr_hold/".$ai2.".csv"; //ユーザー一覧 7 8$section_filepath = "./stock/stock_price.csv"; 9 10$output_file = "output.csv"; 11 12$user_list = array(); 13$section_list = array(); 14$output = array(); 15 16//ユーザー一覧を読み込む 17$user_file = new SplFileObject($user_filepath); 18$user_file->setFlags(SplFileObject::READ_CSV); 19$user_file->setCsvControl("\t"); 20$n=0; //先頭行を飛ばすためのカウンタ 21foreach ($user_file as $line){ 22 if($n>0 && $line[0]!='' && $line[1]!='' && $line[2]!='' && $line[3]!=''){ 23 $user_list[] =array( 24 'ai2_no' => $line[2], 25 'stock_name' => $line[3], 26 'stock_ai' => $line[4], 27 'stock_volume' => $line[5], 28 ); 29 } 30 $n++; 31} 32 33//所属一覧を読み込む 34$section_file = new SplFileObject($section_filepath); 35$section_file->setFlags(SplFileObject::READ_CSV); 36$section_file->setCsvControl("\t"); 37$i=0; //先頭行を飛ばすためのカウンタ 38foreach ($section_file as $line){ 39 if($i>0 && $line[0]!='' && $line[1]!='' && $line[2]!=''){ 40 $section_list[] = array( 41 'name' => $line[0], 42 'ai' => $line[1], 43 'price' => $line[2] 44 ); 45 } 46 $i++; 47 48} 49 50foreach($user_list as $user_data){ 51 //ユーザーデータの所属に対応するIDを取得 52 $ret = sectionCheck($user_data, $section_list); 53 54 //返り値をユーザーデータに結合する 55 $user_data+= $ret; 56 $output[] = $user_data; 57} 58 59//print_r($output); 60/************************************** 61 所属データのIDを返す 62*************************************/ 63function sectionCheck($user, $section){ 64 foreach($section as $s){ 65 if($user['stock_ai'] == $s['ai']){ 66 67 $ret['ai2_no'] = $user['ai2_no']; 68 $ret['stock_name'] = $user['stock_name']; 69 $ret['stock_ai'] = $user['stock_ai']; 70 $ret['stock_volume'] = $user['stock_volume']; 71 $ret['price'] = $s['price']; 72 $ret['shisan'] = $s['price']*$user['stock_volume']; 73// $ret['total'] += $ret['shisan']; 74 75$ai2_no = $ret['ai2_no']; 76$stock_name = $ret['stock_name']; 77$stock_ai = $ret['stock_ai']; 78$stock_volume = $ret['stock_volume']; 79$price = $ret['price']; 80$shisan = $ret['shisan']; 81 82echo "".$ai2_no."\t".$stock_name."\t".$stock_ai."\t".$stock_volume."\t".$price."\t".$shisan.""; 83echo "\n"; 84 } 85 } 86 87 return $ret; 88 89 90} 91

やりたいこと
総資産価値(資産価値の合計)を7列目に入れたいです。
1001total.csv
ユーザー 銘柄   銘柄コード 保有株数 株価 資産価値 総資産価値
1001 トヨタ自動車 7203  500 7127 3563500  5368200
1001 武田薬品工業 4502  300 3763 1128900  5368200
1001 ソニー    6758  100 6758 675800  5368200

作ったPHP

最終行に下記を加えてみました。

$as_total = array_sum(array_column($section, 'shisan'));

php

1 2<?php 3 4$ai2=htmlspecialchars($_GET['ai2'], ENT_QUOTES, "UTF-8"); 5 6$user_filepath ="./usr_hold/".$ai2.".csv"; //ユーザー一覧 7 8$section_filepath = "./stock/stock_price.csv"; 9 10$output_file = "output.csv"; 11 12$user_list = array(); 13$section_list = array(); 14$output = array(); 15 16//ユーザー一覧を読み込む 17$user_file = new SplFileObject($user_filepath); 18$user_file->setFlags(SplFileObject::READ_CSV); 19$user_file->setCsvControl("\t"); 20$n=0; //先頭行を飛ばすためのカウンタ 21foreach ($user_file as $line){ 22 if($n>0 && $line[0]!='' && $line[1]!='' && $line[2]!='' && $line[3]!=''){ 23 $user_list[] =array( 24 'ai2_no' => $line[2], 25 'stock_name' => $line[3], 26 'stock_ai' => $line[4], 27 'stock_volume' => $line[5], 28 ); 29 } 30 $n++; 31} 32 33//所属一覧を読み込む 34$section_file = new SplFileObject($section_filepath); 35$section_file->setFlags(SplFileObject::READ_CSV); 36$section_file->setCsvControl("\t"); 37$i=0; //先頭行を飛ばすためのカウンタ 38foreach ($section_file as $line){ 39 if($i>0 && $line[0]!='' && $line[1]!='' && $line[2]!=''){ 40 $section_list[] = array( 41 'name' => $line[0], 42 'ai' => $line[1], 43 'price' => $line[2] 44 ); 45 } 46 $i++; 47 48} 49 50foreach($user_list as $user_data){ 51 //ユーザーデータの所属に対応するIDを取得 52 $ret = sectionCheck($user_data, $section_list); 53 54 //返り値をユーザーデータに結合する 55 $user_data+= $ret; 56 $output[] = $user_data; 57} 58 59//print_r($output); 60/************************************** 61 所属データのIDを返す 62*************************************/ 63function sectionCheck($user, $section){ 64 foreach($section as $s){ 65 if($user['stock_ai'] == $s['ai']){ 66 67 $ret['ai2_no'] = $user['ai2_no']; 68 $ret['stock_name'] = $user['stock_name']; 69 $ret['stock_ai'] = $user['stock_ai']; 70 $ret['stock_volume'] = $user['stock_volume']; 71 $ret['price'] = $s['price']; 72 $ret['shisan'] = $s['price']*$user['stock_volume']; 73// $ret['total'] += $ret['shisan']; 74 75$ai2_no = $ret['ai2_no']; 76$stock_name = $ret['stock_name']; 77$stock_ai = $ret['stock_ai']; 78$stock_volume = $ret['stock_volume']; 79$price = $ret['price']; 80$shisan = $ret['shisan']; 81 82 83$as_total = array_sum(array_column($section, 'shisan')); 84 85 86echo "".$ai2_no."\t".$stock_name."\t".$stock_ai."\t".$stock_volume."\t".$price."\t".$shisan."\t".$as_total.""; 87echo "\n"; 88 } 89 } 90 91 return $ret; 92 93 94} 95

結果

$as_total は 0になりました。

いろいろ試したところ
$as_total = array_sum(array_column($section, 'price'));
とすると、1001ユーザーの保有銘柄(3銘柄)だけでなく、stock_price.csvに載っているすべての銘柄price(上記例ではコマツからソニーまで8銘柄)の合計が出ます。

$as_total = array_sum(array_column($section, 'stock_volume')); とすると0になります。

foreach($section as $s)
としているため、$section で拾いに行っても、$s = stock_price.csv しか読みにいかないようです。

その結果、array_column($section, 'stock_volume')とした場合、
$ret['price'] = $s['price']; についてはstock_price.csv にある8銘柄すべてを読んでしまいます。

また、$ret['stock_volume'] = $user['stock_volume'];については、$sではなく$userであるため、$sを読めず 0 となり、
当然
$ret['shisan'] = $s['price']*$user['stock_volume'];も0となるようです。

foreach($section as $s)の結果をさらに配列として読み込み、その結果からトータルすればいいところまでは分かるのですが、書き方がわかりません。
ご教示いただきたくお願いいたします。

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

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

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

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

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

yambejp

2020/03/02 02:03

冗長なソースはいらないので、配列データを2つ提示して どういったロジックでどういった配列が出力されるのを期待しているのか記載ください
退会済みユーザー

退会済みユーザー

2020/03/02 13:33

array_sum()って横着せず、必要な掛け算をしたものを足し上げる処理を書いてみたらどうかな。(試してないけど。)
guest

回答1

0

自己解決

そのままでは出来ないようなので上記のPHP(a.php)を読みに行くPHP(b.php)をもう一つ作り、
a.phpの結果をb.phpで足し上げることで解決することとしました。
1つのphpでは難しかったようです。
有難うございました。

投稿2020/03/02 22:28

tajix_japan

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問