php объединяет массивы json

#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 as 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, а затем вы должны заполнить их оба через 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. Это тоже не решает его проблему. Пожалуйста, внимательно ознакомьтесь с вопросом. Ему нужно объединить массивы на основе ключей. Это решение объединит только массивы.