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

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

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

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

Q&A

解決済

1回答

315閲覧

PHP 2つの配列をマージしたい

shimon11

総合スコア49

PHP

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

0グッド

0クリップ

投稿2022/09/16 05:48

$test_data内のargsとdefaultsをマージしてcorrectにしたいです。
1つ目、2つ目、3つ目の全てを満たすような関数を作りたいです。

再帰処理を利用して条件を分けて、2つ目の配列のマージまで作る関数は作れました!
しかし、3つ目の配列でうまくマージが出来ません。。

どなたかご教授お願いできませんでしょうか?

サンプルコード
https://paiza.io/projects/iVXnX5iPK28mRZb8eqxGWA?language=php

完全なコード

PHP

1<?php 2$test_data = array( 3 // 1つ目 同じキーがあったらそのまま 4 array( 5 'args' => array( 6 'key' => 'a', 7 ), 8 'defaults' => array( 9 'key' => 'b', 10 ), 11 'correct' => array( 12 'key' => 'a', 13 ), 14 ), 15 // 2つ目 連想配列 順番はdefaultsに合わせる 16 array( 17 'args' => array( 18 'string' => 'a', 19 'array_1' => array( 20 'array_1_1' => array( 21 'array_key_1_1' => 'array_value_1_1', 22 'array_key_1_2' => 'array_value_1_2', 23 ), 24 ), 25 ), 26 'defaults' => array( 27 'string' => 'b', 28 'array_1' => array( 29 'array_0_1' => array( 30 'array_key_0_1' => 'array_value_0_1', 31 'array_key_0_2' => 'array_value_0_1', 32 ), 33 'array_1_1' => array( 34 'array_key_1_1' => 'array_value_defaults_1_1', 35 'array_key_1_2' => 'array_value_defaults_1_2', 36 ), 37 'array_2_1' => array( 38 'array_key_2_1' => 'array_value_2_1', 39 'array_key_2_2' => 'array_value_2_2', 40 ), 41 ), 42 ), 43 'correct' => array( 44 'string' => 'a', 45 'array_1' => array( 46 'array_0_1' => array( 47 'array_key_0_1' => 'array_value_0_1', 48 'array_key_0_2' => 'array_value_0_1', 49 ), 50 'array_1_1' => array( 51 'array_key_1_1' => 'array_value_1_1', 52 'array_key_1_2' => 'array_value_1_2', 53 ), 54 'array_2_1' => array( 55 'array_key_2_1' => 'array_value_2_1', 56 'array_key_2_2' => 'array_value_2_2', 57 ), 58 ), 59 ), 60 ), 61 // 3つ目 配列の中に配列 62 array( 63 'args' => array( 64 'array_key' => array( 65 array( 66 'array_key_1' => 'array_value_1_1', 67 'array_key_2' => 'array_value_1_2', 68 'array_key_3' => 'array_value_1_3', 69 ), 70 array( 71 'array_key_1' => 'array_value_2_1', 72 'array_key_2' => 'array_value_2_2', 73 'array_key_3' => 'array_value_2_3', 74 ), 75 ), 76 ), 77 'defaults' => array( 78 'array_key' => array( 79 array( 80 'array_key_1' => 'array_defaults_value_1_1', 81 'array_key_2' => 'array_defaults_value_1_2', 82 'array_key_3' => 'array_defaults_value_1_3', 83 ), 84 ), 85 ), 86 'correct' => array( 87 'array_key' => array( 88 array( 89 'array_key_1' => 'array_value_1_1', 90 'array_key_2' => 'array_value_1_2', 91 'array_key_3' => 'array_value_1_3', 92 ), 93 array( 94 'array_key_1' => 'array_value_2_1', 95 'array_key_2' => 'array_value_2_2', 96 'array_key_3' => 'array_value_2_3', 97 ), 98 ), 99 ), 100 ), 101); 102// マージする関数 103function my_merge_func($a, $b) { 104 $merged = $b; 105 foreach($a as $key => $value) { 106 if( !is_array($value) && array_key_exists( $key, $b ) ) { 107 $merged[$key] = $value; 108 } else if( is_array($value) && is_array($b[$key])) { 109 $merged[$key] = my_merge_func($value, $b[$key]); 110 } 111 } 112 return $merged; 113} 114 115foreach ( $test_data as $test_value ) { 116 $return = my_merge_func($test_value['args'],$test_value['defaults']); 117 var_dump($return); 118 var_dump($return === $test_value['correct']); 119}

エラーメッセージ
PHP Warning: Undefined array key 1 in /workspace/Main.php on line 108が出ます

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

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

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

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

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

guest

回答1

0

ベストアンサー

php

1function my_merge_func($a, $b) { 2 $merged = $b; 3 foreach($a as $key => $value) { 4 if( !is_array($value) && array_key_exists( $key, $b ) ) { 5 $merged[$key] = $value; 6 } else if( is_array($value) && isset($b[$key]) && is_array($b[$key])) { 7 $merged[$key] = my_merge_func($value, $b[$key]); 8 } else { 9 $merged[$key] = $value; 10 } 11 } 12 return $merged; 13}

こうでしょうか。

投稿2022/09/16 08:47

arcxor

総合スコア2859

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

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

shimon11

2022/09/16 12:53

ありがとうございます! ご提示いただいたコードでうまくいきそうです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問