- ベストアンサー
配列を再帰的に上書きでマージする方法と注意点
- 配列を再帰的に上書きでマージする方法を教えてください。元の配列を書き換えずに上書きでマージしたいです。
- array_merge_recursiveでは後の値が元の値を上書きせずに追加されますが、上書きでマージする方法はありますか?
- 特定の配列から別の配列へ要素を再帰的にマージする方法を教えてください。
- みんなの回答 (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; } ?>
その他の回答 (1)
- hogehoge78
- ベストアンサー率80% (433/539)
<?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'); に修正するという処理を加えてあります。
お礼
なるほど! 配列ではなく文字列が渡された場合など実用的な事まで入れていただきたいへん助かりました。早速使わせていただきます。 本当にありがとうございました。_○_
お礼
さらに実用的になりました。重ねてお礼申し上げます!
補足
『$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; } ?> いずれにせよありがとうございました。