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

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

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

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

Q&A

解決済

1回答

3146閲覧

複数の配列内で同一キーの値の最小値のみを残す処理

sakamata

総合スコア203

PHP

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

0グッド

0クリップ

投稿2017/12/29 14:06

以下の様な配列から、nullを排除し特定のキーとその最小値のみを1つの配列として導き出したいのですが、うまく行かず苦労しています。

php

1var_dump($groups); 2 3 0 => 4 array (size=6) 5 'AAA' => null 6 'BBB' => float 10 7 'DDD' => float 1000 8 'EEE' => null 9 'FFF' => float 100000 10 1 => 11 array (size=4) 12 'AAA' => float 2 13 'CCC' => float 200 14 'DDD' => float 2000 15 'FFF' => null

  
求めたい配列の加工結果例

php

1 array (size=5) 2 'AAA' => float 2 3 'BBB' => float 10 4 'CCC' => float 200 5 'DDD' => float 1000 6 'FFF' => float 100000

条件

  • 配列は例は2つの連想配列だが、3つ以上になるケースがある。
  • キーは各配列ごとにまちまちに存在しているが、統一されたキーも出力される
  • 統一されたキーがある場合は、各配列の中の同じキーの最小値を入れる
  • キー内が全てnullのものは削除

ひとまずやってみましたが、コールバック関数が苦手なので、まず、存在するキー全てを取り出してから foreach をネストしてなんとかしようと思ったのですが、なんともならずです。

php

1 // 複数配列からキーのみを抽出する 2 $keys = []; 3 foreach ($groups as $idx => $array) { 4 var_dump($array); 5 $keys += array_keys($array); 6 } 7 $keys = array_unique($keys); 8 var_dump($keys); 9 10 // 共通キーの最小値を入れる 11 $returnArray = []; 12 $minArray = []; 13 $i = 0; 14 foreach ($groups as $idx => $group) { 15 foreach ($keys as $id) { 16 if (isset($group[$id])) { // null 排除 17 // キーに紐づいた配列を作成し、0より多く前より小さい時だけ入れる? 18 // もしくは配列内の最小値を求める? 19 // この辺で挫折しました。(下の行はエラーになります) 20 // $minArray[$i] += array($id => $group[$id]); 21 22 $value = $group[$id]; 23 $returnArray += array($id => $value); 24 } 25 $i++; 26 } 27 } 28 29

どのような処理を書けば良いでしょうか、
お力を貸していただければ幸いです。

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

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

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

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

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

guest

回答1

0

自己解決

かなり不格好でリファクタリング前ですが自己解決したので以下に貼ります

php

1 // 複数配列からキーのみを抽出する 2 $keys = []; 3 foreach ($groups as $idx => $array) { 4 $keys += array_keys($array); 5 } 6 $keys = array_unique($keys); 7 var_dump($keys); 8 9 // 共通するキーのみ抽出 10 $dubbleKeys = array_intersect_key($groups[0],$groups[1]); 11 var_dump($dubbleKeys); 12 13 // 共通するキーの値を 配列に入れる 14 // key => 15, 10, 20 15 $minArray =[]; 16 $min =[]; 17 foreach ($dubbleKeys as $key => $hoge) { 18 $min1 = $groups[0][$key]; 19 $min2 = $groups[1][$key]; 20 $min = min($min1, $min2); 21 $minArray += array($key => $min); 22 } 23 var_dump($minArray); 24 var_dump(array_merge($groups[0],$groups[1],$minArray)); 25

改善点 $groups 複数配列の null値は array_filter で事前に削除しました
重複が存在するキーのみを array_intersect_key() で抽出 $dubbleKeys とします。
重複したキーのみを foreach で回し該当キーの複数の値を新たな配列 $min1, $min2 に入れ、
min()関数で最小値を求める
最小値だけのキーと値から構成される配列 $minArray を作成

array_merge($groups[0],$groups[1],$minArray)

最後に array_merge を最初の複数配列と $minArray を加え最小値で重複部分を上書きしました。

投稿2017/12/29 18:37

sakamata

総合スコア203

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問