2012-02-11 2 views
13

두 개의 데이터 객체가 JSON에서 변환되었습니다. 두 가지 모두 상당히 복잡하기 때문에 jQuery가 extend를 사용하여 두 객체를 병합하는 것과 비슷한 방식으로 이들을 병합하고 싶습니다.PHP에서 두 개의 복잡한 객체 병합

예를

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

거의 비슷하지만 기존 키를 덮어 쓰는 대신 두 값을 받아 배열을 만듭니다. 두 개가 들어 있습니다. 이 동작을 변경하는 방법이 있습니까? – 9point6

+1

나는 나의 대답을 업데이트했다. 병합은 당신의 요구 사항을 위해 만들어진 목적이다. – meouw

+0

달콤하고, 내가 어쨌든 내가 한 일에 꽤 가깝다. 감사! – 9point6

3

사용 array-replace-recursive()http://www.php.net/manual/en/function.array-replace-recursive.php
그것은 정확히 당신이 원하는 않습니다.

+2

StackOverflow에 오신 것을 환영합니다! 코드 샘플을 제공해 주시겠습니까? 링크 전용 답변은 여기 환영하지 않습니다. –

+6

Hello @JanDvorak 링크 아래에 충분한 코드 샘플이 있습니다. 꼭 필요한 것이 아니라면 더 나은 대답을 제공해주십시오. – Infinum

+0

죄송합니다. 그러나이 대답은 간단히 잘못되었습니다.이 함수는 객체가 아니라 배열을위한 것입니다. 질문의 데이터에는 개체가 포함되어 있습니다. 물론 객체를 배열로 변환 할 수는 있지만 그 결과는 더 이상 동일한 객체 구조를 갖지 않습니다. – Gerfried