2012-02-11 8 views
13

JSONから2つのデータオブジェクトを変換しました。どちらも非常に複雑で、jQueryがextendを使用して2つのオブジェクトをマージする方法と同様の方法でそれらをマージしたいと思います。PHPで2つの複合オブジェクトをマージする

JSON 1:

{ 
    ... 
    "blah": 
    { 
     "params": 
     { 
      "foo": 
      { 
       "default": "bar", 
       "misc": "0", 
       ... 
      }, 
      ... 
     }, 
     ... 
    }, 
    ... 
} 

JSON 2:

{ 
    ... 
    "blah": 
    { 
     "params": 
     { 
      "foo": 
      { 
       "value": "val", 
       "misc": "1", 
       ... 
      }, 
      ... 
     }, 
     ... 
    }, 
    ... 
} 

PHPオブジェクトでこれをアプローチする最良の方法は何

{ 
    ... 
    "blah": 
    { 
     "params": 
     { 
      "foo": 
      { 
       "default": "bar", 
       "value": "val", 
       "misc": "1", 
       ... 
      }, 
      ... 
     }, 
     ... 
    }, 
    ... 
} 

にマージ。

+4

http://www.php.net/manual/en/function.array-merge-recursive.php –

答えて

31

デコード連想配列に各JSON文字列は、結果と再エンコードをマージ

$a1 = json_decode($json1, true); 
$a2 = json_decode($json2, true); 

$res = array_merge_recursive($a1, $a2); 

$resJson = json_encode($res); 

更新: あなたが特定のマージの要件を持っているなら、あなたはあなた自身のマージ関数を記述する必要があります。 私は質問に記載されているようにあなたの要件を満たす以下を書いています。 あなたが言及していない他の要件がある場合は、それを微調整する必要があります。

<?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] 
} 
*/ 
+0

これはほぼ同じですが、既存のキーを上書きする代わりに、2つの値を取り、配列を作成しますその2つを含む。この動作を変更する方法はありますか? – 9point6

+1

私は自分の答えを更新しました - マージはあなたの要求に合わせて作られたものです – meouw

+0

甘い、とにかく私が最後にしたことにかなり近いです。ありがとう! – 9point6

3

使用array-replace-recursive()http://www.php.net/manual/en/function.array-replace-recursive.php
それは正確に何をしたいん。

+2

ようこそStackOverflowへ!コードサンプルを提供できますか?リンクのみの回答はここでは歓迎されません。 –

+6

こんにちは@JanDvorakリンクの下に十分なコードサンプルがあります。是非とも必要以上に必要があると感じたら、より良い答えを提供してください。 – Infinum

+0

申し訳ありませんが、この答えは間違っています - 関数は配列用であり、オブジェクト用ではありません。問題のデータにはオブジェクトが含まれています。もちろん、オブジェクトを配列などに変換することはできますが、結果は同じオブジェクト構造を持たなくなります。 – Gerfried

関連する問題