$test_data内のargsとdefaultsをマージしてcorrectにしたいです。
全てを満たすような関数を作りたいです。
配列 既に値がある時は埋め合わせる箇所でうまくいかないです。
どなたかご教授お願いできませんでしょうか?
サンプルコード
https://paiza.io/projects/nKdfGQyRigZZX9xbjUsHwQ?language=php
完全なコード
PHP
1<?php 2// このような変数があります。 3$test_data = array( 4 // 配列 空配列の場合array()を返す 5 array( 6 'args' => array( 7 'array_key' => array(), 8 ), 9 'defaults' => array( 10 'array_key' => array( 11 array( 12 'array_key_1' => 'array_defaults_value_1_1', 13 'array_key_2' => 'array_defaults_value_1_2', 14 'array_key_3' => 'array_defaults_value_1_3', 15 ), 16 ), 17 ), 18 'correct' => array( 19 'array_key' => array(), 20 ), 21 ), 22 // 配列 既に値がある時は埋め合わせる 23 array( 24 'args' => array( 25 'array_key' => array( 26 array( 27 'array_key_1' => 'array_value_1_1', 28 'array_key_2' => 'array_value_1_2', 29 ), 30 array( 31 'array_key_1' => 'array_value_2_1', 32 'array_key_2' => 'array_value_2_2', 33 'array_key_3' => 'array_value_2_3', 34 ), 35 ), 36 ), 37 'defaults' => array( 38 'array_key' => array( 39 array( 40 'array_key_1' => 'array_defaults_value_1_1', 41 'array_key_2' => 'array_defaults_value_1_2', 42 ), 43 array( 44 'array_key_1' => 'array_defaults_value_2_1', 45 'array_key_2' => 'array_defaults_value_2_2', 46 ), 47 array( 48 'array_key_1' => 'array_defaults_value_3_1', 49 'array_key_2' => 'array_defaults_value_3_2', 50 ), 51 ), 52 ), 53 'correct' => array( 54 'array_key' => array( 55 array( 56 'array_key_1' => 'array_value_1_1', 57 'array_key_2' => 'array_value_1_2', 58 ), 59 array( 60 'array_key_1' => 'array_value_2_1', 61 'array_key_2' => 'array_value_2_2', 62 'array_key_3' => 'array_value_2_3', 63 ), 64 ), 65 ), 66 ), 67 68); 69 70function my_array_merge( $args, $defaults ) { 71 $merged = $defaults; 72 foreach ( $args as $key => $value ) { 73 if ( is_array( $value ) && isset( $defaults[ $key ] ) && is_array( $defaults[ $key ] ) && ! empty( $value ) ) { 74 $merged[ $key ] = my_array_merge( $value, $defaults[ $key ] ); 75 } else { 76 $merged[ $key ] = $value; 77 } 78 } 79 return $merged; 80} 81 82foreach ( $test_data as $test_value ) { 83 84 $return = my_array_merge( $test_value['args'], $test_value['defaults'] ); 85 $correct = $test_value['correct']; 86 var_dump( $correct === $return ); 87 88} 89
argsとdefaultsをマージしてcorrectにするのに最初からcorrectが設定されているのはなぜでしょう?
correctが無いとマージ後の期待している値がわからないからです。
実際はこれはテストコードになります
一応回答つけましたが、想定と違いますか?
ありがとうございます。私の理解不足かもしれませんが想定しているものと違うように思います
おそらくforeach内のif文を修正すれば良いと思うのですが、、、
```PHP
if ( is_array( $value ) && isset( $defaults[ $key ] ) && is_array( $defaults[ $key ] ) && ! empty( $value ) ) {
```
すみません。上記のコードは間違いです
以下のコードが正しいです
```PHP
'args' => array(
'array_key' => array(
array(
'array_key_1' => 'array_value_1_1',
'array_key_2' => 'array_value_1_2',
),
array(
'array_key_1' => 'array_value_2_1',
'array_key_2' => 'array_value_2_2',
'array_key_3' => 'array_value_2_3',
),
),
),
'defaults' => array(
'array_key' => array(
array(
'array_key_1' => 'array_defaults_value_1_1',
'array_key_2' => 'array_defaults_value_1_2',
),
array(
'array_key_1' => 'array_defaults_value_2_1',
'array_key_2' => 'array_defaults_value_2_2',
),
array(
'array_key_1' => 'array_defaults_value_3_1',
'array_key_2' => 'array_defaults_value_3_2',
),
),
),
'correct' => array(
'array_key' => array(
array(
'array_key_1' => 'array_value_1_1',
'array_key_2' => 'array_value_1_2',
),
array(
'array_key_1' => 'array_value_2_1',
'array_key_2' => 'array_value_2_2',
'array_key_3' => 'array_value_2_3',
),
),
),
```
回答に追記しました。
想定データとなぜそうなるかを説明いただかないと、単純にマージすると私の回答のような結果になると思います。
見る限りでは correct は args をまるっとコピーしたものにしかなってません。
correct を見直して、きちんと望ましい結果にしてみてください。

回答1件
あなたの回答
tips
プレビュー