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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

6039閲覧

PHP連想配列同士を特定の値でgroup byして集計したい

ms5025

総合スコア292

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2020/09/29 00:53

編集2020/09/29 03:56

前提・実現したいこと

以下のようなhogeとfugaの配列があったとして
キーや形は全く同じとします。
その上でtype,kbnごとにサマリーを行いたいです。
foreachで愚直に取る方法しか思い付かず、スマートに取得することは可能でしょうか?

例としては、以下のような配列があったとすると

hoge [ "type"=> '001', "kbn"=> 'AAA', "tax"=> 1, "amount"=> 100 ] [ "type"=> '002', "kbn"=> 'AAAA', "tax"=> 1, "amount"=> 100 ] fuga [ "type"=> '001', "kbn"=> 'AAA', "tax"=> 1, "amount"=> 100 ] [ "type"=> '002', "kbn"=> 'AAA', "tax"=> 1, "amount"=> 100 ] [ "type"=> '001', "kbn"=> 'BBB', "tax"=> 1, "amount"=> 100 ]

合計値が以下のようにとりたいです↓

+" sum": array:1 [ 0 => {#1081 +"type": 001 +"kbn": "AAAA" +"tax": 合計値 +"amount": 合計値 } ] +"sum": array:1 [ 0 => {#1081 +"type": 001 +"kbn": "BBB" +"tax": 合計値 +"amount": 合計値 } ] +"sum": array:1 [ 0 => {#1081 +"type": 002 +"kbn": "BBB" +"tax": 合計値 +"amount": 合計値 } ]

試したこと

foreachで普通に書いたが、array_sum、array_filter、array_columnなどを使ってうまくできないか、
悩んでいる

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

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

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

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

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

yambejp

2020/09/29 00:57

配列はPHPのソースで書いてもらえませんか?
ms5025

2020/09/29 01:19

[ "type"=> 001, "kbn"=> "AAAA", "tax"=> 1, "amount"=> 100 ] こうですか?
yambejp

2020/09/29 01:23

そういう感じです。「001」は文字列なら"001"です
ms5025

2020/09/29 01:35

すいません、その辺実データ手直しして投稿しているため適当です。 申し訳ないです。 それでよろしくお願いします。
yambejp

2020/09/29 01:40

例示されたソースを書き直してください
phper.k

2020/09/29 01:43

配列データはDBから取得したものではないのですか?
ms5025

2020/09/29 01:48

phper.k 配列というかDB:selectで取ってきたデータです 色々と事情があって望んだ結果を既存のデータマージで行うことになりました sqlで書くことができたら楽ですが
ms5025

2020/09/29 01:48

ソース変えました
guest

回答2

0

foreachで愚直に取る方法しか思い付かず、スマートに何かlaravelらしく取得することは可能でしょうか?

DB::select() で取得している以上、戻り値は array になるので、「laravelらしく」Collection クラスでは処理できない。

「laravelらしく」にこだわるなら、Eloquent で取得してください。

投稿2020/09/29 02:50

phper.k

総合スコア3923

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

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

ms5025

2020/09/29 03:55

ありがとうございます! Eloquentだと簡単にきれいにできますね けど今回はarrayで結構です。laravelらしくという表記は消しておきます
phper.k

2020/09/29 04:01

「foreachで愚直に取る方法」が分かっているなら回答は不要だと考えています。
ms5025

2020/09/29 04:13

それが嫌なので、array_sum、array_filter mapなどを使って もう少しきれいになる方法はないか、という質問です。 foreachで愚直取る方法の投稿はもちろん不要です
phper.k

2020/09/29 04:15

「array_sum、array_filter、array_columnなどを使ってうまくできないか」これについて取り組んだことを記載してください。
phper.k

2020/09/29 04:16

あと、サンプルデータの提示をちゃんとしてください。
ms5025

2020/09/29 04:20

分からないのであれば回答は結構です! 方法は大体そんなところを使えば取れるかもしれないな、で例で書いてあるので。 要は愚直な方法ではないスマートな方法があれば教えてくださいということです。 サンプルは発言をわかりやすくするためだけの、例です。 こういった感じでできないかな?とピンとこないのであればスルーしてください。 こちらもそこに時間が裂けないので質問してるだけです。
phper.k

2020/09/29 04:34 編集

あのねー なに逆ギレしてんの? コピペで使えもしないサンプルデータ提示して、他人に回答させるその無神経な態度はいかがなものかともいますよ 時間がないなら foreach で実装すればいいやん
m.ts10806

2020/09/29 06:01 編集

テーブル定義もコードも提示されてないからなんとも言えないけど、データ取得時に使いやすい形で取得できるならそれに越したことはないのです。Laravelに限らずPHPに限らず。取得してから整形なり加工なりしようとしてる時点でスマートさは0。 フレームワークが無用の長物になっただけ。 「分からないなら」というけど、回答できるだけの情報が提示されてないので無理。 時間ないならお金払ってやってもらうべきですね。 質問して回答待ってる時間があるのが不思議。答えてもらえる保証無いし。 時間ないなら幾らかやりとりの必要が発生する質問サイト使うのが間違い。
Zuishin

2020/09/29 06:15

サンプルが雑でロジックが全くわからないけど、foreach でできるならいじらなくていいのに。
ms5025

2020/09/29 17:09

``` $s = collect($hoge)->where('type')->groupBy('kbn')->map(function ($v) { return [ 'type' => $v[0]->type, 'kbn' => $v[0]->kbn, 'tax' => $v->sum('tax'), 'amount' => $v->sum('amount'), ]; })->values()->all(); ``` laravelのcollection使いましたー https://qiita.com/mikakane/items/76ae73990bf1ece9e7ae
guest

0

自己解決

Laravelのcollection使って以下のようにしました

     $array = array_merge($hoge,$fuga); $sum = collect($hoge)->where('type')->groupBy('kbn')->map(function ($v) { return [ 'type'  => $v[0]->type, 'kbn' => $v[0]->kbn, 'tax' => $v->sum('tax'), 'amount' => $v->sum('amount'), ]; })->values()->all();

https://qiita.com/mikakane/items/76ae73990bf1ece9e7ae

投稿2020/09/29 17:11

編集2020/09/29 17:14
ms5025

総合スコア292

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

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

Zuishin

2020/09/29 21:05

これで質問に掲載された結果になりますか?
ms5025

2020/10/01 05:38

なりました! type,kbnでtaxとamountをサマリーできました。 foreachでやるのはちょっとなと思っていたのでLaravelのcollection使いました。
Zuishin

2020/10/01 06:50 編集

質問に「掲載された」結果ですよ? うちで試したところ、文法エラーで動きすらしませんが。 それに一行目で作った $array はどこへ行ったんです?
ms5025

2020/10/01 06:39

上記は例なので文脈で理解していただけると・・ 一行目で作った$arrayは collect($hoge) が間違いで collect($array)ですね。 でも$hogeでも動きますよ。 例を突っ込んでコピペしただけでは動かないので、試してみたければご自分で考えてやってみてください。 よろしくお願いします。
Zuishin

2020/10/01 06:43

文脈からは「この回答を使えば質問の結果が得られる」と読めます。他の意味があるんでしょうか?
phper.k

2020/10/01 06:48 編集

ms5025 さん 雰囲気でこの回答で良しとするなら、今後回答者は雰囲気で回答してもいいのですか? 「こんな感じ」と雰囲気で回答して、まともに動かないコードで回答しても、あなたはそれで問題を解決できるのですか?
m.ts10806

2020/10/01 07:38 編集

>例を突っ込んでコピペしただけでは動かないので、 同じような問題を抱えた人がここに辿り着いて参考にしようとしても地雷を踏ませたいわけですね。 「teratailの回答は参考にならない」と各所で言われる一端です。「あの回答者が」ではなく「teratailが」という評価になるのをお忘れなく。回答もそうですがそのあとのコメントや対応が無責任すぎます。 引用したQiitaの記事の筆者にも悪影響となりえます。 ひとまず地雷であると、そのように回答の冒頭に書いておいてください。 勘違いして大嘘を信じてしまうとあなたより将来有望な可能性のある若者への損失、邪魔にしかなりません。
Zuishin

2020/10/01 08:10

この回答が正しい可能性があるかどうかを聞きたかっただけで、あなたのやりたいことに特に興味はありません。 間違った回答であることがはっきりして安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問