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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

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

Q&A

解決済

2回答

18049閲覧

Laravel の 2つのCollection を 一つにまとめたい

pgm_bakabon

総合スコア61

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

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

Laravel 5

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

0グッド

0クリップ

投稿2020/07/20 10:38

編集2020/07/20 10:40

前提・実現したいこと

Laravel の 2つのCollection を 一つにまとめたいです。

コード上2つのCollectionがあります。

// Collection A Collection {#1005 ▼ #items: array:1 [▼ "price" => 300.0 ] } // Collection B Collection {#1005 ▼ #items: array:1 [▼ "price" => 1200.0 ] }

この二つのCollectionをキーで合計して、一つのCollectionにしたいです。
union や merge を使っても、うまく合計値になりません。
やり方が違うのか知見をお借りしたいです。

該当のソースコード①

// DBから生成 ['price' => 300] の Collection $collection_a = (コード割愛。pluck、mapWithKeysを使用); // 手動で生成 ['price' => 1200] の Collection $collection_b = collect(['price' => 1200]); // unionで合計する $collection_c = $collection_a->union($collection_b); // 結果 Collection {#1005 ▼ #items: array:1 [▼ "price" => 300.0 // 1500.00にならない ] }

該当のソースコード②

// DBから生成 ['price' => 300] の Collection $collection_a = (コード割愛。pluck、mapWithKeysを使用); // 手動で生成 ['price' => 1200] の Collection $collection_b = collect(['price' => 1200]); // mergeで合計する $collection_c = $collection_a->merge($collection_b); // 結果 Collection {#1005 ▼ #items: array:1 [▼ "price" => 1200.0 // 1500.00にならない ] }

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

PHP 7.3
Laravel 5.6

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

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

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

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

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

guest

回答2

0

ベストアンサー

試されたことへの解説

laravel5.6 - union

すでにコレクションにあるキーが、オリジナル配列に含まれている場合は、オリジナルコレクションの値が優先されます。

laravel5.6 - merge

指定した配列の文字列キーが、オリジナルコレクションの文字列キーと一致する場合、オリジナルコレクションの値は指定アイテムの値でオーバーライトされます。

なので勝手に合計はされません。

合計値を出す

合計といえば SUM なので、 laravel5.6 - sum 使います。

php

1>>> $collection_a = collect(['price' => 300.0]); 2>>> $collection_b = collect(['price' => 1200.0]); 3>>> $merge = collect([$collection_a, $collection_b]); 4>>> $sum_price = $merge->pluck('price')->sum(); 5=> 1500.0 6// どうしてもCollection型にしたかったら 7>>> $collection_c = collect(['price' => $sum_price]);

合算したいcollectionが3つ以上あったら、
$merge = collect([$collection_a, $collection_b]); に増やしていけばよいです。

追記:参考

laravel5.8からは mergeRecursive があります
laravel5.8 - mergeRecursive

同じキーごとにまとめてくれる。

php

1>>> $collection_a = collect (['price' => 300.0]); 2>>> $collection_b = collect (['price' => 1200.0]); 3>>> $merge = $collection_a->mergeRecursive($collection_b); 4=> Illuminate\Support\Collection { 5 all: [ 6 "price" => [ 7 1200.0, 8 300.0, 9 ], 10 ], 11 } 12>>> $sum_price = array_sum($merge['price']); 13=> 1500.0

投稿2020/07/22 05:53

編集2020/07/22 06:02
bracket_i

総合スコア193

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

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

pgm_bakabon

2020/07/28 07:51

ご回答ありがとうございます! 試した方法ができない理由、コレクションとコレクションがまとめられないので実現するにはSUMで一度まとめる必要があることわかりました。 コード量は増えてしまいますがSUMすることにしました。 5.8でできるようになってるのは知らなかったです。勉強になりました。
guest

0

mergeunionも、collectionを「結合」するものです。
結合は、合算とは違うので、自動で足し算とかはしてくれません。

例えば、phpの配列関数のarray_mergeも、
配列の結合ですが、同じキーの値を自動で足し算したりしませんよね?
これと同じですね。


単純に1つのcollectionへまとめるだけでも良いのでは?と思いましたが
どうでしょうか。

php

1 $collection_a =collect(['price' => 300]); 2 $collection_b =collect(['price' => 1200]); 3 4 $all_collection = collect([$collection_a, $collection_b]);//1つのcollectionに

$all_collectionの中身はこんな感じ

php

1Collection { 2 #items: array:2 [ 3 0 => Collection { 4 #items: array:1 [ 5 "price" => 300 6 ] 7 } 8 1 => Collection { 9 #items: array:1 [ 10 "price" => 1200 11 ] 12 } 13 ] 14}

合計値は、sum()を使って、簡単に求められます。

php

1dd($all_collection->sum('price')); 2 3//結果 41500

どうしても希望する形にしたいのであれば、
自分で合算するように書くしかないかなと。

以上、ご参考までに。

投稿2020/07/22 05:51

mix-peach

総合スコア1910

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

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

pgm_bakabon

2020/07/28 07:52

ご回答ありがとうございます! Laravel5.6ではどうしても自分で合算するしか方法がなさそうなので、 コード量は増えてしまいますがSUMすることにしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問