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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

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

Q&A

解決済

2回答

922閲覧

[php]連想配列の結合について

cray123

総合スコア47

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

PHP

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

0グッド

0クリップ

投稿2020/06/30 07:23

編集2020/06/30 07:59

やりたいこと

以下のようなリスト形式で入っている各連想配列を特定のキー(以下では'a')を軸にまとめたいのですが、うまくいきません。悪い個所を指摘いただけないでしょうか。よろしくお願いします。

php

1$array1 = array( 2array( 3 'a' => "テスト1", 4 'b'=> 100, 5 'c'=> 1000), 6array( 7 'a' => "テスト2", 8 'b'=> 100, 9 'c'=> 1000)); 10 11$array2 = array( 12array( 13 'a' => "テスト1", 14 'b'=> 50, 15 'c'=> 500), 16array( 17 'a' => "テスト2", 18 'b'=> 40, 19 'c'=> 400));

上記を以下のようにまとめたい

php

1$aum = array( 2array( 3 'a' => "テスト1", 4 'b'=> 150, 5 'c'=> 1500), 6array( 7 'a' => "テスト2", 8 'b'=> 140, 9 'c'=> 1400));

試したこと

php

1$sums = array(); 2foreach (array_keys($array1 + array2 ) as $key) { 3 $sums[$key] = @($array1[$key] + $array2[$key]); 4} 5// 'a'は統合されるが'b'と'c'がsumされない

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/30 07:33

そもそも、連想配列になっていません。 再現可能な質問に修正してください。
cray123

2020/06/30 08:00

こちら修正しました。よろしくお願いします。
guest

回答2

0

次のコードで期待する結果が得られます:

php

1<?php 2$array1 = array( 3 array( 4 'a' => "テスト1", 5 'b'=> 100, 6 'c'=> 1000 7 ), 8 array( 9 'a' => "テスト2", 10 'b'=> 100, 11 'c'=> 1000 12 ) 13); 14$array2 = array( 15 array( 16 'a' => "テスト1", 17 'b'=> 50, 18 'c'=> 500 19 ), 20 array( 21 'a' => "テスト2", 22 'b'=> 40, 23 'c'=> 400 24 ) 25); 26$sums = array(); 27 28foreach (array_keys($array1 + $array2) as $key1) { 29 $merged = array(); 30 $array11 = $array1[$key1]; 31 $array21 = $array2[$key1]; 32 foreach(array_keys($array11 + $array21) as $key2) { 33 $merged[$key2] = $array11[$key2]; 34 if (is_int($array1[$key1][$key2])) { 35 $merged[$key2] += $array21[$key2]; 36 } 37 } 38 $sums[$key1] = $merged; 39} 40 41print_r($sums);

実行結果:

console

1$ php test.php 2Array 3( 4 [0] => Array 5 ( 6 [a] => テスト1 7 [b] => 150 8 [c] => 1500 9 ) 10 11 [1] => Array 12 ( 13 [a] => テスト2 14 [b] => 140 15 [c] => 1400 16 ) 17 18)

投稿2020/06/30 09:14

編集2020/06/30 09:20
y_shinoda

総合スコア3272

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

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

cray123

2020/06/30 09:53

ありがとうございます!参考にさせていただきます!
退会済みユーザー

退会済みユーザー

2020/06/30 10:03

間違ってますよ。 'a'で分類できてません。 以下で確認してみてください。 $array1 = array( array( 'a' => "テスト2", 'b'=> 100, 'c'=> 1000 ), array( 'a' => "テスト1", 'b'=> 100, 'c'=> 1000 ), ); $array2 = array( array( 'a' => "テスト1", 'b'=> 50, 'c'=> 500 ), array( 'a' => "テスト2", 'b'=> 40, 'c'=> 400 ) );
y_shinoda

2020/06/30 10:18

こちらの回答では 与えられたテストデータを期待する結果にするための 最低限の処理のみを記述しています 異なる状況に対応するためにどのようなコードを書くべきかは そのときに検討すれば良いでしょう たとえば、将来、キーが "a", "b", "c" ではない配列に 対応する必要がうまれるかもしれません しかし、今そのような拡張を行うとコードが複雑化していき 何を行うためのプログラムなのか、後で自分でも読み取れなくなるでしょう 将来の拡張は将来に行うべきです このような開発の考え方を「YAGNI の原則」と言います https://ja.wikipedia.org/wiki/YAGNI
退会済みユーザー

退会済みユーザー

2020/06/30 10:26

その発想で回答するなら、 $aum = array( array( 'a' => "テスト1", 'b'=> 150, 'c'=> 1500), array( 'a' => "テスト2", 'b'=> 140, 'c'=> 1400)); が最も効率的です。 まぁ、要件を実装する気がないのであれば、評価下げておきます。
guest

0

ベストアンサー

特定の key でまとめるのであれば、特定の key で分類すれば良いです。

php

1<?php 2$array1 = array( 3 array( 4 'a' => "テスト1", 5 'b'=> 100, 6 'c'=> 1000), 7 array( 8 'a' => "テスト2", 9 'b'=> 100, 10 'c'=> 1000) 11); 12 13$array2 = array( 14 array( 15 'a' => "テスト1", 16 'b'=> 50, 17 'c'=> 500), 18 array( 19 'a' => "テスト2", 20 'b'=> 40, 21 'c'=> 400) 22); 23 24$array = array_merge($array1, $array2); 25$result = []; 26foreach($array as $val){ 27 if(isset($result[$val["a"]])){ 28 $result[$val["a"]] = [ 29 "a" => $result[$val["a"]]["a"], 30 "b" => $result[$val["a"]]["b"] + $val["b"], 31 "c" => $result[$val["a"]]["c"] + $val["c"], 32 ]; 33 } else { 34 $result[$val["a"]] = $val; 35 } 36} 37$aum = array_values($result); 38var_dump($aum);

投稿2020/06/30 08:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

cray123

2020/06/30 09:54

何度もすみません!参考にさせていただきます! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問