2012-02-11 47 views
13

Tôi có hai đối tượng dữ liệu được chuyển đổi từ JSON. cả hai đều khá phức tạp và tôi muốn hợp nhất chúng theo cách tương tự như cách jQuery sẽ hợp nhất hai đối tượng bằng cách sử dụng mở rộng.Hợp nhất hai đối tượng phức tạp trong PHP

dụ

JSON 1:

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

JSON 2:

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

sáp nhập vào

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

cách tốt nhất để tiếp cận này với các đối tượng PHP là gì.

+4

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

Trả lời

31

Giải mã mỗi chuỗi JSON thành một mảng kết hợp, hợp nhất các kết quả và tái mã hóa

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

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

$resJson = json_encode($res); 

Cập nhật: Nếu bạn có một yêu cầu hợp cụ thể sau đó bạn sẽ cần phải viết chức năng kết hợp của riêng bạn . Tôi đã viết một dưới đây đáp ứng các yêu cầu của bạn như được nêu trong câu hỏi. Bạn có thể cần phải tinh chỉnh nó nếu bạn có các yêu cầu khác mà bạn chưa đề cập.

<?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

Điều này gần như thực hiện, nhưng thay vì ghi đè lên khóa hiện có, phải mất hai giá trị và tạo một mảng có chứa hai. Có cách nào để thay đổi hành vi này không? – 9point6

+1

Tôi đã cập nhật câu trả lời của tôi - hợp nhất là mục đích được xây dựng cho các yêu cầu của bạn – meouw

+0

Ngọt ngào, Nó khá gần với những gì tôi đã làm cuối cùng anyway. Cảm ơn! – 9point6

3

Sử dụng array-replace-recursive()http://www.php.net/manual/en/function.array-replace-recursive.php
Nó thực hiện chính xác những gì bạn muốn.

+2

Chào mừng bạn đến với StackOverflow! Bạn có thể cung cấp mẫu mã không? Các câu trả lời chỉ có liên kết không được chào đón ở đây. –

+6

Xin chào @JanDvorak Có quá nhiều mẫu mã trong liên kết. Nếu bạn cảm thấy bạn cần nhiều hơn tất cả các phương tiện, vui lòng cung cấp câu trả lời tốt hơn. – Infinum

+0

Xin lỗi, nhưng câu trả lời này chỉ đơn giản là sai - chức năng dành cho mảng - không phải cho các đối tượng. Dữ liệu trong câu hỏi chứa các đối tượng. Tất nhiên, bạn có thể chuyển đổi các đối tượng thành các mảng và ngược lại, nhưng kết quả sẽ không có cùng một cấu trúc đối tượng nữa. – Gerfried

Các vấn đề liên quan