2014-09-01 4 views
1

У меня есть массив:Losing значения с array_merge

{ 
    "zone1":{ 
    "foo1":"bar1", 
    "foo2":"bar2", 
    "foo3":"bar3", 
    "foo4":"bar4" 
    }, 
    "zone2":{ 
    "newfoo1":"newbar1", 
    "newfoo2":"newbar2", 
    "newfoo3":"newbar3", 
    "newfoo4":"newbar4" 
    }, 
    "zone3":{ 
    "morefoo1":"morebar1", 
    "morefoo2":"morebar2", 
    "morefoo3":"morebar3", 
    "morefoo4":"morebar4" 
    } 
} 

И я хочу, чтобы объединить второй массив с обновленными значениями:

{ 
    "zone1":{ 
    "foo1":"updatedbar1" 
    }, 
    "zone3":{ 
    "morefoo2":"updatedbar2", 
    "morefoo4":"updatedbar4" 
    } 
} 

Я пробовал много вещей, что Im используя теперь это код PHP:

$array3 = array_merge($array1, $array2); 

Но этот код дает мне это:

{ 
    "zone1":{ 
    "foo1":"updatedbar1" 
    }, 
    "zone2":{ 
    "newfoo1":"newbar1", 
    "newfoo2":"newbar2", 
    "newfoo3":"newbar3", 
    "newfoo4":"newbar4" 
    }, 
    "zone3":{ 
    "morefoo2":"updatedbar2", 
    "morefoo4":"updatedbar4" 
    } 
} 

Что я хочу, просто обновить первый массив со значениями во втором массиве, не теряя при этом никаких данных. Массивы - это json, они из json-файлов, но язык - это PHP.

+0

Какой язык программирования? – MrTux

+2

Вызов 'array_merge' явно PHP, но ваши массивы показаны здесь как JSON. Просьба уточнить. – Charles

+0

Да, мои массивы из json-файлов с использованием json_decode и json_encode. Мой язык - это PHP. –

ответ

3

Вы можете использовать array_replace_recursive():

$array3 = array_replace_recursive($array1, $array2); 

Создается массив с данными:

Array 
(
    [zone1] => Array 
     (
      [foo1] => updatedbar1 
      [foo2] => bar2 
      [foo3] => bar3 
      [foo4] => bar4 
     ) 

    [zone2] => Array 
     (
      [newfoo1] => newbar1 
      [newfoo2] => newbar2 
      [newfoo3] => newbar3 
      [newfoo4] => newbar4 
     ) 

    [zone3] => Array 
     (
      [morefoo1] => morebar1 
      [morefoo2] => updatedbar2 
      [morefoo3] => morebar3 
      [morefoo4] => updatedbar4 
     ) 

) 

Посмотри на ideone.

+0

сообщение помогло мне, спасибо помощнику. – Burrito

0

array_merge() только сливает массив верхнего уровня и не учитывает массивы внутри массивов. Поэтому дублирующиеся значения будут перезаписаны последним массивом.

Вы можете решить эту проблему с помощью array_merge_recursive():

$ar1 = array("color" => array("favorite" => "red"), 5); 
$ar2 = array(10, "color" => array("favorite" => "green", "blue")); 
$result = array_merge_recursive($ar1, $ar2); 

Более подробную информацию можно найти на php.net page

- EDIT

Первый комментарий на странице уже упоминалось выше, объясняет, как для объединения двух массивов при использовании второго для обновления первого:

<?php 
/** 
* array_merge_recursive does indeed merge arrays, but it converts values with duplicate 
* keys to arrays rather than overwriting the value in the first array with the duplicate 
* value in the second array, as array_merge does. I.e., with array_merge_recursive, 
* this happens (documented behavior): 
* 
* array_merge_recursive(array('key' => 'org value'), array('key' => 'new value')); 
*  => array('key' => array('org value', 'new value')); 
* 
* array_merge_recursive_distinct does not change the datatypes of the values in the  arrays. 
* Matching keys' values in the second array overwrite those in the first array, as is  the 
* case with array_merge, i.e.: 
* 
* array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value')); 
*  => array('key' => array('new value')); 
* 
* Parameters are passed by reference, though only for performance reasons. They're  not 
* altered by this function. 
* 
* @param array $array1 
* @param array $array2 
* @return array 
* @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk> 
* @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com> 
*/ 
function array_merge_recursive_distinct (array &$array1, array &$array2) 
{ 
    $merged = $array1; 

    foreach ($array2 as $key => &$value) 
    { 
    if (is_array ($value) && isset ($merged [$key]) && is_array ($merged [$key])) 
    { 
     $merged [$key] = array_merge_recursive_distinct ($merged [$key], $value); 
    } 
    else 
    { 
    $merged [$key] = $value; 
    } 
    } 

    return $merged; 
} 
?> 
+0

рекурсивный, я попробовал его, и значения, которые находятся в обоих массивах, не будут перезаписаны, будут друг с другом, например: «newfoo1»: ["newbar1", "updatedbar1"] –

+0

Кажется, что работает с ' array_replace_recursive ', завтра я сделаю больше тестов, и если это не сработает, я попробую ваше редактирование, спасибо. –