• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つの配列を再帰的に上書きでマージしたい)

配列を再帰的に上書きでマージする方法と注意点

このQ&Aのポイント
  • 配列を再帰的に上書きでマージする方法を教えてください。元の配列を書き換えずに上書きでマージしたいです。
  • array_merge_recursiveでは後の値が元の値を上書きせずに追加されますが、上書きでマージする方法はありますか?
  • 特定の配列から別の配列へ要素を再帰的にマージする方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

貼り付けたスクリプトに若干修正ミスがありましたので、再度、貼り付けます。また、機能を付け加えてあり、 $arr2の値が配列ではなかった場合で且つ$arr1が配列だった場合は、$arr1のインデックスキーが0のところに値を貼り付ける処理にしました。 <?php function mymerge($arr1, $arr2){ foreach($arr2 as $key=>$value){ if(!is_array($arr1)){ $arr1 = array($arr1); } if(is_array($value)){ $arr1[$key] = mymerge($arr1[$key], $value); }else{ if(is_array($arr1[$key])){ $arr1[$key][0] = $value; }else{ $arr1[$key] = $value; } } } return $arr1; } ?>

noname#207939
質問者

お礼

さらに実用的になりました。重ねてお礼申し上げます!

noname#207939
質問者

補足

『$arr2の値が配列ではなかった場合で且つ$arr1が配列だった場合は、$arr1のインデックスキーが0のところに値を貼り付ける』との事ですが、[0]の値のみ書き換えられるのではなくすべて書き換えられた方が希望に合った動作になりました。 (「array_merge_recursiveに準じた動作で上書き」という意味としては間違っているのかもしれませんが) <?php function mymerge($arr1, $arr2){ foreach($arr2 as $key=>$value){ if(!is_array($arr1)){ $arr1 = array($arr1); } if(is_array($value)){ $arr1[$key] = mymerge($arr1[$key], $value); }else{ $arr1[$key] = $value; } } return $arr1; } ?> いずれにせよありがとうございました。

その他の回答 (1)

回答No.1

<?php $arr1 = array( 'hoge' => array('1', '2', '3'), 'mogo' => 'aaaaaaa', ); $arr2 = array( 'hoge' => array(0=>'6', 2=>'123'), 'mogo' => array('bbbbbb', 'cccccc') ); print_r(mymerge($arr1, $arr2)); function mymerge($arr1, $arr2){ if(!is_array($arr1)){ $arr1 = array(); } foreach($arr2 as $key=>$value){ if(is_array($value)){ $arr1[$key] = mymerge($arr1[$key], $value); }else{ $arr1[$key] = $value; } } return $arr1; } ?> 例示されていたmymerge関数に修正を加えてみました。 こんな感じでどうでしょう。 一点、上書きをするという挙動で特殊な例があり、 $arr1['moge'] = 'aaaaaa'; とあるものに、 $arr2['moge'] = array('bbbb', 'cccc'); といったものを上書きをするという挙動に関して、 文字列に配列を代入すると文字列が配列として動作してしまい、結果、文字列の各添え字に値が代入されるという挙動が行われてしまうので、 $arr1['moge'] = 'aaaaaa'; とあったら、 $arr1['moge'] = array('aaaaa'); に修正するという処理を加えてあります。

noname#207939
質問者

お礼

なるほど! 配列ではなく文字列が渡された場合など実用的な事まで入れていただきたいへん助かりました。早速使わせていただきます。 本当にありがとうございました。_○_

関連するQ&A

専門家に質問してみよう