#php #mysql #arrays #json
#php #mysql #массивы #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"}
]
Идентификаторы игроков всегда уникальны. Надеюсь услышать, что я мог бы сделать, чтобы объединить эти 2 массива (array1, array2)
(Дополнительно / Редактировать) Для тех, кому интересно, как выглядит 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';
Комментарии:
1. Вам лучше использовать операцию соединения MYSQL в запросе при извлечении данных
2. Я попробовал MySQL JOIN на этом, не смог разобраться в них, потому что он из 2 разных таблиц, но для одного запроса требуется GROUP BY, а для другого нет.
3. отредактировано выше, чтобы включить MySQL
4. Во 2-м запросе вы можете попробовать с помощью nCity. Идентификатор игрока, nPlayer.userName, nPlayer.castleCount, …..
5. @sgkdnay. Я предоставил пояснения о требуемом вами выводе и также предоставил код. Поделитесь мыслями и дайте мне знать, если вы столкнетесь с какими-либо препятствиями.
Ответ №1:
Подробное объяснение
Вы можете присоединиться к массиву 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
сделать то, что мы получили, исходяkey
из того, чтоunique
для нас.
Следовательно, функция для кода выглядит следующим образом.
Я рассмотрел идентификатор игрока как УНИКАЛЬНЫЙ параметр и объединил массив.
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
asarray 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, а затем вы должны заполнить их оба через 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"}]
Комментарии:
1. Этот метод работает хорошо. Пока один человек не упомянул JOIN, я просто ударил головой по столу и не понял, насколько это просто. Определенно будет полезно для дополнительной работы, которую я планирую выполнять с другими JSON
Ответ №2:
Предположим 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);
Ответ №3:
В 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) amp;amp; 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,
),
),
);
}
}
Ответ №4:
Не могли бы вы попробовать это с помощью цикла foreach?
Пример данных 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"
}
}
Ответ №5:
function mergeArrays(array $arr1, array $arr2, string $idKeyName) {
$data = [];
foreach ($arr1 as $value) {
$id = $value[$idKeyName];
$data[$id] = $value;
}
foreach ($arr2 as $value) {
$id = $value[$idKeyName];
if (isset($data[$id])) {
$data[$id] = array_merge($data[$id], $value);
} else {
$data[$id] = $value;
}
}
return array_values($data);
}
$arr1 = [["id" => "66395", "substanceId" => 182], ["id" => "66396", "substanceId" => 183]];
$arr2 = [["id" => "66395_new", "substanceId" => 182], ["id" => "66397", "substanceId" => 184]];
$result = mergeArrays($arr1, $arr2, 'substanceId');
# var_export($result)
array (
0 =>
array (
'id' => '66395_new',
'substanceId' => 182,
),
1 =>
array (
'id' => '66396',
'substanceId' => 183,
),
2 =>
array (
'id' => '66397',
'substanceId' => 184,
),
)
Ответ №6:
Этот 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. Извините, моя ошибка, была исправлена
Комментарии:
1. Это тоже не решает его проблему. Пожалуйста, внимательно ознакомьтесь с вопросом. Ему нужно объединить массивы на основе ключей. Это решение объединит только массивы.