php merge json массивы

массив 1:

[ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0"} ] 

массив 2:

 [ {"PlayerID":"17794204","Trouble":"2"}, {"PlayerID":"21532584","Trouble":"0"}, {"PlayerID":"21539896","Trouble":"0"} ] 

Оба были извлечены из базы данных mySQL, используя fetch_assoc_all ()

Я попробовал merge_array, merge_array_recursive, json_decode (xx, true) и всевозможные вещи, которые я мог бы подумать на моей голове и в другом месте через google. Я ищу способ объединить как array1, array2 во что-то вроде:

 [ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000","Trouble":"2"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0","Trouble":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0","Trouble":"0"} ] 

PlayerID всегда уникальны. Надеюсь услышать, что я мог бы сделать, чтобы объединить эти 2 массива (array1, array2)

(Additonal / Edit) Для тех, кто задается вопросом о том, что выглядит mySQL (я не мог окутать голову в инструкцию JOIN):

 $mSQL = 'SELECT nPlayer.PlayerID,userName,castleCount,IF(LastUpdate < (UNIX_TIMESTAMP() - 3720),LastUpdate*1000,0) NotUpd'; $mSQL .= ' FROM nPlayer'; $mSQL .= ' LEFT JOIN nMains ON nMains.mID = nPlayer.mID'; $mSQL .= ' WHERE nMains.Main = "'.$M.'" AND nMains.Pass = "'.md5($P).'" AND nMains.Server = "'.$S.'"'; $mSQL .= ' ORDER BY nPlayer.PlayerID'; $mSQL = 'SELECT nCity.PlayerID,SUM(IF(Wartown > 0,1,0))+SUM(IF(support < 100,1,0))) Trouble'; $mSQL .= ' FROM nCity'; $mSQL .= ' INNER JOIN nPlayer ON nPlayer.PlayerID = nCity.PlayerID AND nPlayer.mID = nCity.mID'; $mSQL .= ' INNER JOIN nMains ON nMains.mID = nPlayer.mID'; $mSQL .= ' WHERE nMains.Main = "'.$M.'" AND nMains.Pass = "'.md5($P).'" AND nMains.Server = "'.$S.'"'; $mSQL .= ' GROUP BY nCity.PlayerID'; 

Related of "php merge json массивы"

Детальное объяснение

Вы можете присоединиться к массиву JSON на основе ключевого значения, которое вы получите, если вам нужно предоставить, по какому ключу вы должны присоединиться к json_array() .

Я рассмотрю json_objects следующим образом на основе кода PHP.

 <?php $array1 = '[ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0"} ]'; $array2 = '[ {"PlayerID":"17794204","Trouble":"2"}, {"PlayerID":"21532584","Trouble":"0"}, {"PlayerID":"21539896","Trouble":"0"} ]'; ?> 

Следовательно, для слияния json_objects мы должны сначала использовать json_decode() для обоих полученных нами массивов.

 $decode_one = json_decode($array1,TRUE); $decode_two = json_decode($array2,TRUE); 

Следовательно, вывод для json_decoded() будет следующим.

Первая декодированная строка:

 Array ( [0] => Array ( [PlayerID] => 17794204 [userName] => Vandiel [castleCount] => 9 [NotUpd] => 1476253231000 ) [1] => Array ( [PlayerID] => 21532584 [userName] => Mayland [castleCount] => 1 [NotUpd] => 0 ) [2] => Array ( [PlayerID] => 21539896 [userName] => Dana [castleCount] => 9 [NotUpd] => 0 ) ) 

Вторая декодированная строка:

 Array ( [0] => Array ( [PlayerID] => 17794204 [Trouble] => 2 ) [1] => Array ( [PlayerID] => 21532584 [Trouble] => 0 ) [2] => Array ( [PlayerID] => 21539896 [Trouble] => 0 ) ) 

После этого мы должны merge the two arrays которые мы получили на основе unique для нас key .

Следовательно, функция для кода следующая.

Я рассматривал PlayerID как UNIQUE Parameter и объединил массив.

 function merge_json_decoded_arrays($decode_one,$decode_two) { $data = array(); $arrayAB = array_merge($decode_one,$decode_two); foreach ($arrayAB as $value) { $id = $value['PlayerID']; if (!isset($data[$id])) { $data[$id] = array(); } $data[$id] = array_merge($data[$id],$value); } return $data; } 

Вам нужно вызвать такую ​​функцию из кода, где вам нужно выполнить операции array_merge() .

 $merged_array = merge_json_decoded_arrays($decode_one,$decode_two); 

Наконец, полный код появляется с настройкой.

Полный код:

 <?php $array1 = '[ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0"} ]'; $array2 = '[ {"PlayerID":"17794204","Trouble":"2"}, {"PlayerID":"21532584","Trouble":"0"}, {"PlayerID":"21539896","Trouble":"0"} ]'; $decode_one = json_decode($array1,TRUE); $decode_two = json_decode($array2,TRUE); function merge_json_decoded_arrays($decode_one,$decode_two) { $data = array(); $arrayAB = array_merge($decode_one,$decode_two); foreach ($arrayAB as $value) { $id = $value['PlayerID']; if (!isset($data[$id])) { $data[$id] = array(); } $data[$id] = array_merge($data[$id],$value); } return $data; } $merged_array = merge_json_decoded_arrays($decode_one,$decode_two); ?> 

Чтобы просмотреть объединенный массив, вам нужно print_r() массив и просмотреть его.

Код выхода массива:

 print_r($merged_array); 

Вывод:

 Array ( [17794204] => Array ( [PlayerID] => 17794204 [userName] => Vandiel [castleCount] => 9 [NotUpd] => 1476253231000 [Trouble] => 2 ) [21532584] => Array ( [PlayerID] => 21532584 [userName] => Mayland [castleCount] => 1 [NotUpd] => 0 [Trouble] => 0 ) [21539896] => Array ( [PlayerID] => 21539896 [userName] => Dana [castleCount] => 9 [NotUpd] => 0 [Trouble] => 0 ) ) 

Если вам это нужно как выход JSON, вы должны выполнить json_encode() полученный array() и выполнить операции.

Примечание: для каждой строки, которая была сгенерирована, требуется unique ID в качестве array key .

Код выхода JSON:

 print_r(json_ecode($merged_array)); 

Вывод:

 {"17794204":{"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000","Trouble":"2"},"21532584":{"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0","Trouble":"0"},"21539896":{"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0","Trouble":"0"}} 

Самый быстрый способ выполнения будет таким образом

Вам нужно декодировать json_strings, а затем вы должны llop оба из них через foreach() а затем объединитесь с array() которым вам нужно присоединиться.

 $decode_one = json_decode($array1,TRUE); $decode_two = json_decode($array2,TRUE); foreach ($decode_one as $key => $first_value) { foreach ($decode_two as $key_two => $second_value) { if($first_value['PlayerID']==$second_value['PlayerID']) { $decode_one[$key]['Trouble'] = $second_value['Trouble'];//Here if the key exists it will join the Trouble with the First decoded array } else {} } } $combined_output = json_encode($decode_one); //This will return the output in json format. 

Вывод:

 [{"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000","Trouble":"2"},{"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0","Trouble":"0"},{"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0","Trouble":"0"}] 

Предположим, что json1 и json2 – ваши две строки JSON, решение для объединения этих двух строк JSON будет выглядеть так:

  • Сначала декодируйте эти две строки JSON, используя json_decode() чтобы получить $decodedArray1 и $decodedArray2 массивы.
  • Запустите две вложенные петли foreach чтобы объединить $decodedArray2 в массив $decodedArray1 .
  • Наконец, примените функцию json_encode() в массиве $decodedArray1 чтобы получить результирующую строку JSON.

Вот код:

 $decodedArray1 = json_decode($json1, true); $decodedArray2 = json_decode($json2, true); foreach($decodedArray1 as $key => $array1){ foreach($decodedArray2 as $array2){ if($array1['PlayerID'] == $array2['PlayerID']){ $decodedArray1[$key]['Trouble'] = $array2['Trouble']; } } } $resultantJson = json_encode($decodedArray1); 

Вот живая демонстрация

В PHP нет функции, которая делает то, что вы хотите. Если вы посмотрите вокруг обычных подозрительных фреймворков, вы обнаружите, что они используют функции слияния, такие как:

 /** * @param array $array * @param array $other * * @return array */ function _array_merge(array $array, array $other) { foreach ($other as $key => $value) { if (isset($array[$key]) || array_key_exists($key, $array)) { if (is_int($key)) { $array[] = $value; } elseif (is_array($value) && is_array($array[$key])) { $array[$key] = _array_merge($array[$key], $value); } else { $array[$key] = $value; } } else { $array[$key] = $value; } } return $array; } 

С вышесказанным вы можете json_decode() каждый элемент, затем объединить их, а затем json_encode() результат.

Для полноты здесь приведен тестовый пример для указанной выше функции слияния:

 <?php class ArrayMergeTest extends \PHPUnit_Framework_TestCase { public function testMerge(array $expected, array $a, array $b) { $this->assertSame($expected, _array_merge($a, $b)); } /** * @return array */ public function provideMerge() { return array( 'should-preserve-integer-keys' => array( array( 2 => array('a', 'b', 'c'), 3 => array('d', 'e', 'f'), ), array(2 => array('a', 'b', 'c')), array(2 => array('d', 'e', 'f')), ), 'should-merge-when-no-existing-key' => array( array( 'a' => array('b', 'c'), 'd' => array('e', 'f'), ), array('a' => array('b', 'c')), array('d' => array('e', 'f')), ), 'should-overwrite-key-when-not-array' => array( array('a' => 'b'), array('a' => 'foo'), array('a' => 'b'), ), 'should-merge-recursive' => array( array('a' => array(0 => 'b', 1 => 'c')), array('a' => array('b')), array('a' => array('c')), ), 'should-replace-string-keys' => array( array('foo' => 'baz', 'bar' => 'bat'), array('foo' => 'bar', 'bar' => array()), array('foo' => 'baz', 'bar' => 'bat'), ), 'should-merge-nested' => array( array('a' => array('b' => array('baz', 'bat'))), array('a' => array('b' => array('baz'))), array('a' => array('b' => array('bat'))), ), 'should-merge-simple-keys' => array( array('a' => 'a_val', 'b' => 'b_val'), array('a' => 'a_val'), array('b' => 'b_val'), ), // Ensure documentation examples work 'doc_example_1' => array( array(42 => 'x', 43 => 'y'), array(42 => 'x'), array(42 => 'y'), ), 'doc_example_2_a' => array( array('x' => 'b'), array('x' => 'a'), array('x' => 'b'), ), 'doc_example_2_b' => array( array('x' => 'b'), array('x' => array('a')), array('x' => 'b'), ), 'doc_example_2_c' => array( array('x' => array('b')), array('x' => 'a'), array('x' => array('b')), ), 'doc_example_2_d' => array( array('x' => array('a', 'b')), array('x' => array('a')), array('x' => array('b')), ), 'merge-integer-and-string-keys' => array( array( 0 => 'foo', 3 => 'bar', 'baz' => 'baz', 4 => array( 'a', 1 => 'b', 'c', ), 5 => 'baz', 6 => array( 'd' => 'd', ), ), array( 'foo', 3 => 'bar', 'baz' => 'baz', 4 => array( 'a', 1 => 'b', 'c', ), ), array( 'baz', 4 => array( 'd' => 'd', ), ), ), 'merge-arrays-recursively' => array( array( 'foo' => array( 0 => 'baz', 1 => 'baz', ), ), array( 'foo' => array( 'baz', ), ), array( 'foo' => array( 'baz', ), ), ), 'replace-string-keys' => array( array( 'foo' => 'baz', 'bar' => 'bat', ), array( 'foo' => 'bar', 'bar' => array(), ), array( 'foo' => 'baz', 'bar' => 'bat', ), ), 'merge-with-null' => array( array( 'foo' => 'baz', null => 'zad', 'cat' => 'bar', 'god' => null, ), array( 'foo' => null, null => 'rod', 'cat' => 'bar', 'god' => 'rad', ), array( 'foo' => 'baz', null => 'zad', 'god' => null, ), ), ); } } 

Не могли бы вы попробовать его использовать foreach loop?

Пример данных jSON 1:

  $json1='[ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0"} ]'; 

Пример данных jSON 2:

 $json2='[ {"PlayerID":"17794204","Trouble":"2"}, {"PlayerID":"21532584","Trouble":"0"}, {"PlayerID":"21539896","Trouble":"0"} ]'; 

Сначала декодируйте полученные вами данные json для преобразования в виде массивов

 $array1=json_decode($json1,true); $array2=json_decode($json2,true); 

После преобразования используйте следующий цикл foreach, чтобы проверить 'PlayerID' равен в обоих массивах. Если они совпадают, то слияние с массивом результатов выполняется в виде следующих скриптов:

  $result = array(); foreach($array1 as $data1) { foreach($array2 as $data2) { if($data1['PlayerID'] == $data2['PlayerID']) { $tmp = array("Trouble" => $data2['Trouble']); $tmp = array_merge($data1, $tmp); $result[] = $tmp; } } } 

Результат будет объединен после массива точно так, как вам хотелось:

  array(3) { [0]=> array(5) { ["PlayerID"]=> string(8) "17794204" ["userName"]=> string(7) "Vandiel" ["castleCount"]=> string(1) "9" ["NotUpd"]=> string(13) "1476253231000" ["Trouble"]=> string(1) "2" } [1]=> array(5) { ["PlayerID"]=> string(8) "21532584" ["userName"]=> string(7) "Mayland" ["castleCount"]=> string(1) "1" ["NotUpd"]=> string(1) "0" ["Trouble"]=> string(1) "0" } [2]=> array(5) { ["PlayerID"]=> string(8) "21539896" ["userName"]=> string(4) "Dana" ["castleCount"]=> string(1) "9" ["NotUpd"]=> string(1) "0" ["Trouble"]=> string(1) "0" } } 

Этот PHP-код должен сделать трюк:

 $array1 = json_decode('[ {"PlayerID":"17794204","userName":"Vandiel","castleCount":"9","NotUpd":"1476253231000"}, {"PlayerID":"21532584","userName":"Mayland","castleCount":"1","NotUpd":"0"}, {"PlayerID":"21539896","userName":"Dana","castleCount":"9","NotUpd":"0"} ]'); $array2 = json_decode('[ {"PlayerID":"17794204","Trouble":"2"}, {"PlayerID":"21532584","Trouble":"0"}, {"PlayerID":"21539896","Trouble":"0"} ]'); $arrays_merged = array_merge($array1, $array2); 

РЕДАКТИРОВАТЬ

Забыли котировки вокруг данных json. Извините, мое плохое, исправлено