2012-02-11 8 views
13

Tengo dos objetos de datos convertidos de JSON. ambos son bastante complejos y me gustaría fusionarlos de forma similar a como jQuery fusionaría dos objetos usando extender.Fusionando dos objetos complejos en PHP

ejemplo

JSON 1:

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

JSON 2:

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

fusionado en

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

Cuál es la mejor manera de abordar esto con objetos PHP.

+4

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

Respuesta

31

Decode cada cadena JSON en una matriz asociativa, combinar los resultados y volver a codificar

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

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

$resJson = json_encode($res); 

Actualización: Si usted tiene un requisito de combinación específico, entonces usted tendrá que escribir su propia función fusión . He escrito uno a continuación que cumple con sus requisitos como se indica en la pregunta. Es posible que deba modificarlo si tiene otros requisitos que no ha mencionado.

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

Esto casi lo hace, pero en lugar de sobrescribir una clave existente, toma los dos valores y crea una matriz conteniendo los dos. ¿Hay alguna manera de cambiar este comportamiento? – 9point6

+1

He actualizado mi respuesta: la fusión está especialmente diseñada para sus necesidades – meouw

+0

Dulce, de todos modos, es bastante similar a lo que hice al final. ¡Gracias! – 9point6

3

Uso array-replace-recursive()http://www.php.net/manual/en/function.array-replace-recursive.php
Hace exactamente lo que desea.

+2

¡Bienvenido a StackOverflow! ¿Puedes proporcionar una muestra de código por favor? Las respuestas de solo enlace no son bienvenidas aquí. –

+6

Hola @JanDvorak Hay muestras de código más que suficientes bajo el enlace. Si cree que necesita algo más que por supuesto, proporcione una mejor respuesta. – Infinum

+0

Lo sentimos, pero esta respuesta es simplemente incorrecta: la función es para matrices, no para objetos. Los datos en la pregunta contienen objetos. Por supuesto, puede convertir los objetos en matrices y de otro modo, pero el resultado ya no tendrá la misma estructura de objetos. – Gerfried