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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

1094閲覧

PHP 多次元配列内の特定キーで同じ値を持つものを足し算する

mgcl

総合スコア1

CSV

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/09 02:53

前提・実現したいこと

PHPでcsvを読み込み、データを配列に格納した後の処理に詰まっています.
以下のlog.csvで集計対象日が同日のsafariとchromeの訪問者の合算値を出したいです.

log.csv
2020/5/8,2020/5/7,safari,12567
2020/5/8,2020/5/7,chrome,18467
2020/5/9,2020/5/8,safari,14564
2020/5/9,2020/5/8,chrome,21245
2020/5/10,2020/5/9,safari,11432
2020/5/10,2020/5/9,chrome,18334
(フォーマットは 集計日時,集計対象日,ブラウザ,訪問者)

集計イメージ
2020/5/7,31034
2020/5/8,35809
2020/5/9,29766
(フォーマットは 集計対象日,訪問者の合算値)

発生している問題・エラーメッセージ

file_get_contentsでファイルを読み込んで配列に格納した後、特定キーで同じ値を持っているものの別のキーの値を足していくという処理にて集計イメージのように計算していくにはどうしたら良いでしょうか.

該当のソースコード

PHP

1<?php 2$file = file_get_contents('log.csv'); 3//変数を改行毎の配列に変換 4$array = explode("\n", $file); 5$array_file = []; 6foreach ($array as $key => $value) { 7 if (!$value) { 8 continue; 9 } //空白行が含まれていたら除外 10 $array_file[] = explode(",", $value); 11} 12print_r($array_file); 13?>

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

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

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

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

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

guest

回答1

0

こんな感じでしょうか?

投稿2020/11/09 03:13

yambejp

総合スコア116728

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

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

yambejp

2020/11/09 03:13

<?PHP $data=[ ["2020/5/8","2020/5/7","safari",12567], ["2020/5/8","2020/5/7","chrome",18467], ["2020/5/9","2020/5/8","safari",14564], ["2020/5/9","2020/5/8","chrome",21245], ["2020/5/10","2020/5/9","safari",11432], ["2020/5/10","2020/5/9","chrome",18334], ]; $result=array_map(function($x) use($data){ return [$x,array_reduce($data,function($y,$z) use($x){ return $y+($x==$z[1]?$z[3]:0); })]; },array_unique(array_map(function($x){ return $x[1]; },$data)) ); print_r($result);
mgcl

2020/11/12 05:43

ありがとうございます. 実現したいことができるのは確認できたのですが、初心者のため仕組みが理解できず... 解説いただけると幸いです.
yambejp

2020/11/12 06:18

分解するとこんな感じ $target_date=array_map(function($x){ return $x[1]; },$data); print "(1):"; print_r($target_date); $target_unique_date=array_unique($target_date); print "<hr>"; print "(2):"; print_r($target_unique_date); print "<hr>"; print "(3):"; $result=array_map(function($x) use($data){ $sum=array_reduce($data,function($y,$z) use($x){ return $y+($x==$z[1]?$z[3]:0); }); return [$x,$sum]; },$target_unique_date ); print_r($result);
yambejp

2020/11/12 06:20

(1)で$dataから2列目のデータを取り出します (2)それをユニーク(重複削除)します (3)ユニークな日付を一つ一つ検証し、$dataからその日付と2列目が合致したとき 4列目のデータを足し、そうでない場合は0を足しています 結果として、日付と合計値が得られます
mgcl

2020/11/13 03:22

ご丁寧にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問