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

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

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

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

Q&A

解決済

2回答

21206閲覧

PHPの連想配列で同じキーの値を合計する方法を教えてください。

maaaalon

総合スコア15

PHP

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

1グッド

2クリップ

投稿2016/08/26 09:39

編集2016/08/26 09:50


$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);

このような配列があった場合以下のような結果になる関数などありますでしょうか?
同じkeyだった場合、そのキーの値が足される。

$array3 = array('red' => 2, 'purple' => 4'green' => 8, 'blue' => 7, 'yellow' => 7, 'cyan' => 8);

また出来れば複数の配列をループで合計したいです。

$array = array(
array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4),
array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8),
array('red' => 4, 'blue' => 6, 'yellow' => 7, 'cyan' => 8),
array('green' => 5, 'green' => 6, 'yellow' => 7, 'cyan' => 3),
array('green' => 5, 'blue' => 6, 'green' => 7, 'cyan' => 5)
);
こんな感じの多次元配列を合計したいです。

よろしくお願いいたします。

mpyw👍を押しています

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

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

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

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

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

kei344

2016/08/26 09:44

ご自身で書かれたコードを質問文に追記いただいたほうが回答を得られやすいと思います。
guest

回答2

0

せっかくなのでPHPの関数を生かした短い別解を書いておきます

PHP5.6以降で動作

php

1<?php 2 3$groups = [ 4 ['blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4], 5 ['green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8], 6 ['red' => 4, 'blue' => 6, 'yellow' => 7, 'cyan' => 8], 7 ['green' => 5, 'green' => 6, 'yellow' => 7, 'cyan' => 3], 8 ['green' => 5, 'blue' => 6, 'green' => 7, 'cyan' => 5], 9]; 10 11$results = array_map( 12 function ($row) { return array_sum((array)$row); }, 13 $groups ? array_merge_recursive(...$groups) : [] 14); 15 16var_dump($results);

PHP5.3以降で動作

php

1<?php 2 3$groups = array( 4 array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4), 5 array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 6 array('red' => 4, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 7 array('green' => 5, 'green' => 6, 'yellow' => 7, 'cyan' => 3), 8 array('green' => 5, 'blue' => 6, 'green' => 7, 'cyan' => 5), 9); 10 11$results = array_map( 12 function ($row) { return array_sum((array)$row); }, 13 $groups ? call_user_func_array('array_merge_recursive', $groups) : array() 14); 15 16var_dump($results);
  • PHP5.4以降ではarray()よりも[]を使うべきです
  • PHP5.6以降ではcall_user_func_array()よりも...を使うべきです

PHPは関数型言語ではないので,無理にforeachを排除してコールバック関数だらけにすると読みにくくてしょうがなくなったりするんですが,今回は組み込み関数が array_merge_recursive array_sum と2つも生かせるので,こういう場合には array_map を使うのもアリでしょう.

初心者を戒めるPHP (そんなにarray_mapが書きたいか?) - Qiita

投稿2016/08/26 14:21

編集2016/08/26 14:55
mpyw

総合スコア5223

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

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

0

ベストアンサー

php

1<?php 2 3$array = array( 4 array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4), 5 array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 6 array('red' => 4, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 7 array('green' => 5, 'green' => 6, 'yellow' => 7, 'cyan' => 3), 8 array('green' => 5, 'blue' => 6, 'green' => 7, 'cyan' => 5) 9); 10 11function arraySum(array $arr) 12{ 13 $res = []; 14 if (is_array($arr)) { 15 foreach ($arr as $val) { 16 foreach ($val as $k => $v) { 17 if (isset($res[$k])) { 18 $res[$k] += $v; 19 } else { 20 $res[$k] = 0; 21 } 22 } 23 } 24 } 25 return $res; 26} 27 28var_dump(arraySum($array));

php

1<?php 2 3$array = array( 4 array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4), 5 array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 6 array('red' => 4, 'blue' => 6, 'yellow' => 7, 'cyan' => 8), 7 array('green' => 5, 'green' => 6, 'yellow' => 7, 'cyan' => 3), 8 array('green' => 5, 'blue' => 6, 'green' => 7, 'cyan' => 5) 9); 10 11function arraySum(array $arr) 12{ 13 $res = []; 14 if (!is_array($arr)) { 15 return; 16 } 17 foreach ($arr as $val) { 18 foreach ($val as $k => $v) { 19 if (!isset($res[$k])) { 20 $res[$k] = 0; 21 } 22 $res[$k] += $v; 23 } 24 } 25 return $res; 26} 27 28var_dump(arraySum($array)); 29

投稿2016/08/26 10:02

編集2016/08/26 10:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/08/26 10:16

$res[$k] = 0; これは $res[$k] = $v; じゃないですか?
退会済みユーザー

退会済みユーザー

2016/08/26 10:23

> te2ji さん ???試してみてくださいな。 もしそれでいいなら、if 分岐の意味ないと思いません?
maaaalon

2016/08/26 10:25

function arraySum(array $arr) { $res = []; if (is_array($arr)) { foreach ($arr as $val) { foreach ($val as $k => $v) { if (isset($res[$k])) { $res[$k] += $v; } else { $res[$k] = $v; } } } } return $res; } こちらで出来ました。 te2jiさん、Kosuke_Shibuyaさん有難うございました。 これで家に帰れます。
退会済みユーザー

退会済みユーザー

2016/08/26 10:27

> te2ji さん 失礼!間違ってました。
退会済みユーザー

退会済みユーザー

2016/08/26 10:32

いえ、いつも勉強になってます。 親切すぎでは?w
退会済みユーザー

退会済みユーザー

2016/08/26 10:37 編集

> te2ji さん いつもコード書いてあげてるからですか? 日本語書くより楽だから…w コードを書いたところで理解できない人は理解できませんから、どうせw その代わり、同質の質問ばかりして、以前の回答を理解していればわかることを繰り返す人には、引導渡します。
退会済みユーザー

退会済みユーザー

2016/08/26 10:40

最近少しコードでの会話、理解できるようになってきました。 他人への回答を横取りで学んでますが、ありがとうございます^^
退会済みユーザー

退会済みユーザー

2016/08/26 10:44

> te2ji さん 素晴らしいです。 目の前の問題が解決すればそれでバイバイしちゃう質問者が多いなか、とてもいいサイトの使い方してらっしゃいますよね。
退会済みユーザー

退会済みユーザー

2016/08/26 10:47

> maaaalon さん > これで家に帰れます。 炎上案件、火消しが必要でしたら、口座番号を教えますので、お声がけください。
maaaalon

2016/09/05 05:24

Kosuke_Shibuya 有難うございます。 もしそのような案件があった際には、お願いするかもしれません。 その際はお声がけさせていだきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問