2012-02-11 36 views
13

JSON'dan dönüştürülen iki veri nesnesi var. her ikisi de oldukça karmaşıktır ve jQuery'nin uzayı kullanarak iki nesneyi nasıl birleştireceğine benzer bir şekilde birleştirmek isterim.PHP'de iki karmaşık nesneyi birleştirme

örnek

JSON 1:

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

JSON 2:

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

PHP nesnelerle bu yaklaşım en iyi yolu nedir

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

içine birleştirilmiş.

+4

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

cevap

31

Decode bir ilişkisel dizi haline her JSON dizesi, sonuçları ve yeniden kodlamak birleştirme

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

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

$resJson = json_encode($res); 

Güncelleme: Belirli bir birleştirme gereksinimi varsa sonra kendi birleştirme işlevi yazmak gerekir . Aşağıda yazılı olarak, ihtiyacınızda belirtilen şartları yerine getirdiğim için yazdım. Belirtmediğiniz başka gereksinimleriniz varsa, onu düzeltmeniz gerekebilir.

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

Neredeyse bunu yapar, ancak varolan bir anahtarın üzerine yazmak yerine, iki değeri alır ve bir dizi oluşturur. ikisini içeren. Bu davranışı değiştirmenin bir yolu var mı? – 9point6

+1

Cevabımı güncelledim - birleştirme gereksinimleriniz için oluşturulmuş bir amaçtır. – meouw

+0

Tatlı, Sonunda yaptığım şeye oldukça yakın. Teşekkürler! – 9point6

3

Kullanım array-replace-recursive()http://www.php.net/manual/en/function.array-replace-recursive.php
Bu tam olarak istediğiniz yapar.

+2

StackOverflow'a Hoş Geldiniz! Bir kod örneği verebilir misiniz lütfen? Sadece bağlantıya verilen cevaplar burada hoş karşılanmaz. –

+6

Hello @JanDvorak Bağlantı altında yeterince kod örneği var. Hala daha fazla ihtiyacınız olduğunu düşünüyorsanız, lütfen daha iyi bir cevap verin. – Infinum

+0

Üzgünüm, ama bu cevap basitçe yanlıştır - işlev diziler içindir - nesneler için değil. Sorudaki veriler nesneleri içerir. Tabii ki, nesneleri dizilere dönüştürebilirdiniz, ancak sonuç artık aynı nesne yapısına sahip olmayacak. – Gerfried

İlgili konular