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)の結果をさらに配列として読み込み、その結果からトータルすればいいところまでは分かるのですが、書き方がわかりません。
ご教示いただきたくお願いいたします。
回答1件
あなたの回答
tips
プレビュー