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

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

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

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

Q&A

1回答

261閲覧

多次元配列で条件にマッチした配下の配列をマージさせる方法を教えてください。

t.tohda

総合スコア15

PHP

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

0グッド

2クリップ

投稿2018/06/25 08:43

質問の仕方が合っているかわからないのですが、
以下の条件で、後述の配列を修正し直したいです。

良い方法があれば教えていただけると幸いです。

マージさせる条件

  • groupの値が同じである場合
  • priceの配列をマージする---
  • マージしたあとのpriceの配列のキーは重複させない

マージする前の配列

php

1$array = array( 2 0 => array( 3 'group' => 'AAA', 4 'name' => 'AAA-Group', 5 'price' => array( 6 0 => array( 7 'label' => 'S', 8 'price' => 38790, 9 ), 10 1 => array( 11 'class' => 'S', 12 'price' => 35790, 13 ), 14 ), 15 ), 16 1 => array( 17 'group' => 'AAA', 18 'name' => 'AAA-Group', 19 'price' => array( 20 0 => array( 21 'label' => 'N', 22 'price' => 10800, 23 ), 24 1 => array( 25 'class' => 'N', 26 'price' => 10800, 27 ), 28 2 => array( 29 'class' => 'N', 30 'price' => 21600, 31 ), 32 ), 33 ), 34 2 => array( 35 'group' => 'BBB', 36 'name' => 'BBB-Group', 37 'price' => array( 38 0 => array( 39 'label' => 'S', 40 'price' => 38790, 41 ), 42 1 => array( 43 'class' => 'S', 44 'price' => 35790, 45 ), 46 ), 47 ), 48);

希望するマージ後の配列の状態

php

1$array = array( 2 0 => array( 3 'group' => 'AAA', 4 'name' => 'AAA-Group', 5 'price' => array( 6 0 => array( 7 'label' => 'S', 8 'price' => 38790, 9 ), 10 1 => array( 11 'class' => 'S', 12 'price' => 35790, 13 ), 14 2 => array( 15 'label' => 'N', 16 'price' => 10800, 17 ), 18 3 => array( 19 'class' => 'N', 20 'price' => 10800, 21 ), 22 4 => array( 23 'class' => 'N', 24 'price' => 21600, 25 ), 26 ), 27 ), 28 2 => array( 29 'group' => 'BBB', 30 'name' => 'BBB-Group', 31 'price' => array( 32 0 => array( 33 'label' => 'S', 34 'price' => 38790, 35 ), 36 1 => array( 37 'class' => 'S', 38 'price' => 35790, 39 ), 40 ), 41 ), 42);

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

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

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

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

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

guest

回答1

0

サンプル数が少ないのであっているか検証が不十分ですが

PHP

1$a = [ 2 [ 3 'group' => 'AAA', 4 'name' => 'AAA-Group', 5 'price' => [ 6 [ 7 'label' => 'S', 8 'price' => 38790, 9 ], 10 [ 11 'class' => 'S', 12 'price' => 35790, 13 ], 14 ], 15 ], 16 [ 17 'group' => 'AAA', 18 'name' => 'AAA-Group', 19 'price' => [ 20 [ 21 'label' => 'N', 22 'price' => 10800, 23 ], 24 [ 25 'class' => 'N', 26 'price' => 10800, 27 ], 28 [ 29 'class' => 'N', 30 'price' => 21600, 31 ], 32 ], 33 ], 34 [ 35 'group' => 'BBB', 36 'name' => 'BBB-Group', 37 'price' => [ 38 [ 39 'label' => 'S', 40 'price' => 38790, 41 ], 42 [ 43 'class' => 'S', 44 'price' => 35790, 45 ], 46 ], 47 ], 48 ]; 49 50foreach($a as $key1=>&$b){ 51 foreach($a as $key2=>$c){ 52 if($key1>=$key2) continue; 53 if($b["group"]==$c["group"]){ 54 $b["price"]=array_merge($b["price"],$c["price"]); 55 unset($a[$key2]); 56 } 57 } 58} 59print_r($a);

投稿2018/06/25 09:36

yambejp

総合スコア114843

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

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

t.tohda

2018/06/25 16:46 編集

ありがとうございます! データが続いた場合、2週目の挙動がおかしかったので、 以下のようにループの外でキーの削除をしてみたところうまくいきました。 foreachを二回まわしていますが、データ量が多くなった場合問題になってくるものでしょうか? ```php foreach ( $a as $key1 => &$b ) { foreach ( $a as $key2 => $c ) { if ( $key1 >= $key2 ) { continue; } if ( $b["group"] == $c["group"] ) { $b["price"] = array_merge( $b["price"], $c["price"] ); // unset( $a[ $key2 ] ); // 削除対象のキーを配列に格納しておく $delete_keys[] = $key2; } } } // 重複する値を削除 $delete_keys = array_unique( $delete_keys ); // 配列からマージされた側のキーを削除 foreach ( $delete_keys as $k => $v ) { unset( $a[ $v ] ); } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問