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

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

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

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

Q&A

解決済

1回答

649閲覧

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

shimon11

総合スコア49

PHP

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

0グッド

0クリップ

投稿2022/12/06 04:47

$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

関連
https://teratail.com/questions/k0dalvmpoh35t7

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

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

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

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

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

yambejp

2022/12/06 05:20

argsとdefaultsをマージしてcorrectにするのに最初からcorrectが設定されているのはなぜでしょう?
shimon11

2022/12/06 05:43

correctが無いとマージ後の期待している値がわからないからです。 実際はこれはテストコードになります
yambejp

2022/12/06 05:56

一応回答つけましたが、想定と違いますか?
shimon11

2022/12/06 05:59

ありがとうございます。私の理解不足かもしれませんが想定しているものと違うように思います おそらくforeach内のif文を修正すれば良いと思うのですが、、、 ```PHP if ( is_array( $value ) && isset( $defaults[ $key ] ) && is_array( $defaults[ $key ] ) && ! empty( $value ) ) { ```
shimon11

2022/12/06 06:28

すみません。上記のコードは間違いです 以下のコードが正しいです ```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', ), ), ), ```
yambejp

2022/12/06 06:53

回答に追記しました。 想定データとなぜそうなるかを説明いただかないと、単純にマージすると私の回答のような結果になると思います。
mather

2022/12/06 11:15

見る限りでは correct は args をまるっとコピーしたものにしかなってません。 correct を見直して、きちんと望ましい結果にしてみてください。
guest

回答1

0

ベストアンサー

※大幅に割愛

$a=[ [ 'args' => ['string' => 'a'], 'defaults' => ['string' => 'b'], ], ];

$a=[ [ 'args' => ['string' => 'a'], 'defaults' => ['string' => 'b'], 'correct' => ['string' => 'a'], ], ];

になればいいということであれば

PHP

1$a=[ 2 [ 3 'args' => ['string' => 'a'], 4 'defaults' => ['string' => 'b'], 5 ], 6 ]; 7 8foreach($a as &$b){ 9 $b["correct"]=$b["args"]; 10} 11unset($b); 12print_r($a);

投稿2022/12/06 05:32

編集2022/12/06 09:06
yambejp

総合スコア114883

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

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

shimon11

2022/12/06 07:01

すみません。言葉足らずでした 元々argsにはデータが入っていてそれにデフォルト値をマージしたいという意味でマージ関数を作っています。 ```PHP // argsに同じキーがあったらそのまま array( 'args' => array( 'string' => 'a', ), 'defaults' => array( 'string' => 'b', ), 'correct' => array( 'string' => 'a', ), ), ``` そのためcorrectのような配列を期待しています
yambejp

2022/12/06 07:30

defaultは無視してargsの値を単にcorrectに入れるだけなのでしょうか? マージになっていませんが?
shimon11

2022/12/06 08:16

correctは用意されていないというか、期待した値として比べる用途以外では使わないものになります
yambejp

2022/12/06 09:07

正直命題が理解できていません。一応回答をまるっと書き換えました。 これで違うなら残念ながらお役にたてそうもありません。
shimon11

2022/12/06 09:25

度々の回答ありがとうございます。 もう少し文章を考えてから再度質問を作り直すことにします その際はもし回答いただけるのであれば、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問