Merging two complex objects in PHP
Decode each JSON string into an associative array, merge the results and re-encode
$a1 = json_decode( $json1, true );
$a2 = json_decode( $json2, true );
$res = array_merge_recursive( $a1, $a2 );
$resJson = json_encode( $res );
Update: If you have a specific merge requirement then you'll need to write your own merging function. I have written one below which fulfills your requirements as stated in the question. You may need to tweak it if you have other requirements you haven't mentioned.
<?php
$json1 = '
{
"blah":
{
"params":
{
"foo":
{
"default": "bar",
"misc": "0"
}
},
"lost":
{
"one": "hat",
"two": "cat"
}
}
}';
$json2 = '
{
"blah":
{
"lost": "gone",
"params":
{
"foo":
{
"value": "val",
"misc": "1"
}
}
},
"num_array": [12, 52, 38]
}';
$a1 = json_decode( $json1, true );
$a2 = json_decode( $json2, true );
/*
* Recursive function that merges two associative arrays
* - Unlike array_merge_recursive, a differing value for a key
* overwrites that key rather than creating an array with both values
* - A scalar value will overwrite an array value
*/
function my_merge( $arr1, $arr2 )
{
$keys = array_keys( $arr2 );
foreach( $keys as $key ) {
if( isset( $arr1[$key] )
&& is_array( $arr1[$key] )
&& is_array( $arr2[$key] )
) {
$arr1[$key] = my_merge( $arr1[$key], $arr2[$key] );
} else {
$arr1[$key] = $arr2[$key];
}
}
return $arr1;
}
$a3 = my_merge( $a1, $a2);
$json3 = json_encode( $a3 );
echo( $json3 );
/*
{
"blah":
{
"params":
{
"foo":
{
"default": "bar",
"misc": "1",
"value": "val"
}
},
"lost": "gone"
},
"num_array": [12,52,38]
}
*/
Use array-replace-recursive()
http://www.php.net/manual/en/function.array-replace-recursive.php
It does exactly what you want.