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

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

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

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

配列

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

Q&A

解決済

3回答

2833閲覧

配列の重複を削除して加算する方法について2

kumin

総合スコア10

PHP

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

配列

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

0グッド

0クリップ

投稿2016/09/06 07:49

編集2016/09/06 07:52

以前、同様の内容をhttps://teratail.com/questions/14889 にて質問をさせていただき下記の回答をいただいたのですが、
配列の数が多い場合、全ての配列の中身が正常に重複を削除されないことがでてきました。

php

1$buf = array(); 2foreach ($array as $i => $a) { 3 if (empty($buf[$a['id']])) { 4 $buf[$a['id']] = $i; 5 } else { 6 $array[$buf[$a['id']]]['amount'] += $a['amount']; 7 unset($array[$i]); 8 } 9}

配列例

処理前の配列

php

1Array 2( 3 [0] => Array 4 ( 5 [id] => 21462 6 [amount] => 2 7 ) 8 9 [1] => Array 10 ( 11 [id] => 21462 12 [amount] => 2 13 ) 14 15 [2] => Array 16 ( 17 [id] => 21351 18 [amount] => 3 19 ) 20 21 [3] => Array 22 ( 23 [id] => 21351 24 [amount] => 3 25 ) 26 27 [4] => Array 28 ( 29 [id] => 21352 30 [amount] => 3 31 ) 32 33 [5] => Array 34 ( 35 [id] => 21352 36 [amount] => 3 37 ) 38 39 [6] => Array 40 ( 41 [id] => 13394 42 [amount] => 2 43 ) 44 45 [7] => Array 46 ( 47 [id] => 13394 48 [amount] => 2 49 ) 50 51 [8] => Array 52 ( 53 [id] => 502 54 [amount] => 3 55 ) 56 57 [9] => Array 58 ( 59 [id] => 502 60 [amount] => 3 61 ) 62 63 [10] => Array 64 ( 65 [id] => 500 66 [amount] => 2 67 ) 68 69 [11] => Array 70 ( 71 [id] => 500 72 [amount] => 2 73 ) 74 75)

処理後の配列

php

1Array 2( 3 [0] => Array 4 ( 5 [id] => 21462 6 [amount] => 2 7 ) 8 9 [1] => Array 10 ( 11 [id] => 21462 12 [amount] => 2 13 ) 14 15 [2] => Array 16 ( 17 [id] => 21351 18 [amount] => 6 19 ) 20 21 [4] => Array 22 ( 23 [id] => 21352 24 [amount] => 6 25 ) 26 27 [6] => Array 28 ( 29 [id] => 13394 30 [amount] => 4 31 ) 32 33 [8] => Array 34 ( 35 [id] => 502 36 [amount] => 6 37 ) 38 39 [10] => Array 40 ( 41 [id] => 500 42 [amount] => 4 43 ) 44 45)

のようになります。

基本は重複を削除でき、束ねられるのですが、上記の例ではid 21462の部分がうまく重複を削除し、加算ができておりませんでした。

全ての値で重複を削除し、amount値を加算できず困っております。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

提示されたコードを全く無視してますが(すみません、自分で書いてみたかったもので)こちらでどうでしょうか。

PHP

1$tmp = Array(); 2foreach( $array as $key => $a ){ 3 $tmp[$a['id']] += $a['amount']; 4} 5$array = Array(); 6$i = 0; 7foreach( $tmp as $key => $m ){ 8 $array[$i]['id'] = $key; 9 $array[$i]['amount'] = $m; 10 $i++; 11}

訂正版
もう解決してしまってますが…。
なんか$iのところがしっくりきてなかったのですが、普通に考えれば下記コードで良かったので、訂正版としてのっけておきます。

PHP

1$tmp = Array(); 2foreach( $array as $key => $a ){ 3 $tmp[$a['id']] += $a['amount']; 4} 5$array = Array(); 6foreach( $tmp as $key => $m ){ 7 $array[] = Array("id" => $key, "amount" => $m); 8}

投稿2016/09/06 08:14

編集2016/09/06 09:43
ttyp03

総合スコア16998

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

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

kumin

2016/09/06 08:33

ご回答いただき誠にありがとうございます。 正常に処理を行うことができました。 ありがとうございました。
guest

0

原因は$buf[$a['id']] === 0の時、emptyと判断してしまうせいですね。

if (empty($buf[$a['id']]))

if (!array_key_exists($a['id'],$buf))
で置き換えると正常動作しました。

投稿2016/09/06 09:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kumin

2016/09/06 11:35

原因のご説明いただき誠にありがとうございます。 大変勉強になりました。
guest

0

ベストアンサー

インデックスの値([0], [1], ... 部分)が変わってしまっても構わないなら、

php

1// error_reporting(E_ALL); 2 3$array = array( 4 array( 5 'id' => 21462, 6 'amount' => 2 7 ), 8 array( 9 'id' => 21462, 10 'amount' => 2 11 ), 12 array( 13 'id' => 21351, 14 'amount' => 3 15 ), 16 array( 17 'id' => 21351, 18 'amount' => 3 19 ), 20 array( 21 'id' => 21352, 22 'amount' => 3 23 ), 24 array( 25 'id' => 21352, 26 'amount' => 3 27 ), 28 array( 29 'id' => 13394, 30 'amount' => 3 31 ), 32 array( 33 'id' => 13394, 34 'amount' => 3 35 ), 36 array( 37 'id' => 502, 38 'amount' => 3 39 ), 40 array( 41 'id' => 502, 42 'amount' => 3 43 ), 44 array( 45 'id' => 500, 46 'amount' => 3 47 ), 48 array( 49 'id' => 500, 50 'amount' => 3 51 ) 52); 53 54$buf = array(); 55foreach ($array as $a) { 56 $value = (isset($buf[$a['id']]) ? $buf[$a['id']] : 0); 57 $buf[$a['id']] = $value + $a['amount']; 58} 59 60// print_r($buf); 61 62$newArray = array(); 63foreach ($buf as $id => $amount) { 64 $newArray[] = array('id' => $id, 'amount' => $amount); 65} 66 67print_r($newArray);

実行結果

Array ( [0] => Array ( [id] => 21462 [amount] => 4 ) [1] => Array ( [id] => 21351 [amount] => 6 ) [2] => Array ( [id] => 21352 [amount] => 6 ) [3] => Array ( [id] => 13394 [amount] => 6 ) [4] => Array ( [id] => 502 [amount] => 6 ) [5] => Array ( [id] => 500 [amount] => 6 ) )

投稿2016/09/06 08:28

編集2016/09/06 08:32
KiyoshiMotoki

総合スコア4791

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

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

kumin

2016/09/06 08:33

ご回答いただき誠にありがとうございます。 こちらにて正常に処理を行うことができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問