массив 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';
Вы можете присоединиться к массиву 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_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. Извините, мое плохое, исправлено