Объединить два массива JSON в PHP - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно объединить два файла JSON в PHP . Один сначала пуст, а другой меняется при каждом вызове.

Я нашел много кодов для объединения двух массивов JSON в один в PHP, но у меня это не работает.

$final_array = array();
$first_json = file_get_contents("test3.json");
$second_json = file_get_contents("my-file.json");


if(json_decode($first_json,true) == null){
    $final_array[] = json_decode($second_json,true);
    $merge_final_array = json_encode(json_decode($second_json,true));
}else{
    $final_array[] = json_decode($first_json,true);
    $final_array[] = json_decode($second_json,true);
    $merge_final_array = json_encode($final_array);
}

file_put_contents("test3.json", $merge_final_array);
$merge_final_array = null;

Я рекурсивно добавляю в файл "test3.json" данные, которые я нахожу в "my-file.json".

Это должно дать мне:

[{"score":15,"win":true,"device":"Android SDK built for x86"},{"score":"Finish","device":"Android SDK built for x86","win":true},{"win":true,"score":"Finish","device":"Android SDK built for x86"},{"score":16,"scenario":"Finish","win":true,"device":"Android SDK built for x86"}]

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

[[[{"score":15,"win":true,"device":"Android SDK built for x86"},{"score":"Finish","device":"Android SDK built for x86","win":true}],{"win":true,"score":"Finish","device":"Android SDK built for x86"}],{"score":16,"scenario":"Finish","win":true,"device":"Android SDK built for x86"}]

Я тоже попробовал метод json_encode(array_merge(json_decode($first_json, true),json_decode($second_json, true))) Это дает мне это: Код + результат

Что я сделал не так?

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Сначала вам нужно преобразовать JSON в массивы, прежде чем что-либо делать с ним в PHP.

Сначала вам нужно создать новый пустой массив в PHP и добавить массивы JSON в этот пустой массив.
Затем снова закодируйте массив в JSON и запишите его в файл.
Ваш полный код:

$first_json = file_get_contents("test3.json");
$second_json = file_get_contents("my-file.json");

$first_array = json_decode($first_json, true); // make array of json
$second_array = json_decode($second_json, true); // make array of json

$final_array = array(); // create an empty array 
$final_array[] = $first_array; // add first array to empty array
$final_array[] = $second_array;  // add second array to array

$final_json = json_encode($final_array); // make a json from the array again

file_put_contents("test3.json", $final_json); // put the json inside a new file 
0 голосов
/ 12 июня 2019

Вот что вы хотите:

<?php

$finalArray = [];

// file_get_contents("test3.json");
$firstFileContent = '{"score":15,"win":true,"device":"Android SDK built for x86"}';

// file_get_contents("my-file.json")
$secondFileContent = '{"score":"Finish","device":"Android SDK built for x86","win":true}';

$firstJson = json_decode($firstFileContent, true);
if(JSON_ERROR_NONE === json_last_error()){
    $finalArray[] = $firstJson;
}

$finalArray[] = json_decode($secondFileContent, true);

$finalJson = json_encode($finalArray);

http://sandbox.onlinephpfunctions.com/code/404972fb59b4f7323f81ee444a1cb14f772f7748

Это дает мне это: Код + результат

Это все из-за того, что вы делаете array_merge из двух массивов, а второй перепишет первые значения. Вы должны добавить второй массив к массиву результатов, а не объединять.

array_merge(["a" => 1], ["a" => 2]) // result: ["a" => 2]

$result[] = ["a" => 1];
$result[] = ["a" => 2];
// result: [["a" => 1], ["a" => 2]]

json_encode (array_merge (json_decode ($ first_json, true), json_decode ($ second_json, true)))

Это не будет работать, потому что в каждом файле вы закодировали объект , а не массив объектов. Если у вас есть в первом файле {"a":1} и во втором файле {"a":2}, когда вы объедините их декодированные значения, результат будет {"a":2}, но если вы отредактируете их в [{"a": 1}] и [{"a": 2}], результат будет [{"a": 1}, {"a": 2}], потому что теперь вы объединяете массив объектов, преобразованных в массив, а не объекты.


Если вы хотите рекурсивно добавить данные из обоих файлов, вы должны сделать что-то вроде этого:

<?php

$finalArray = [];

$firstFileContent = '[[{"score":15,"win":true,"device":"Android SDK built for x86"},{"score":"Finish","device":"Android SDK built for x86","win":true}],{"win":true,"score":"Finish","device":"Android SDK built for x86"}]';
$secondFileContent = '{"score":16,"scenario":"Finish","win":true,"device":"Android SDK built for x86"}';

mergeJsonRecursively($finalArray, $firstFileContent);
mergeJsonRecursively($finalArray, $secondFileContent);

function mergeJsonRecursively(array &$result, string $json)
{
    $decodedJson = json_decode($json);
    if (JSON_ERROR_NONE === json_last_error()) {
        tryToAddElementToResult($result, $decodedJson);

        if (is_array($decodedJson)) {
            foreach ($decodedJson as $element) {
                tryToAddElementToResult($result, $element);

                if (is_array($element)) {
                    mergeJsonRecursively($result, json_encode($element));
                }
            }
        }
    }
}

function tryToAddElementToResult(array &$result, $element)
{
    if (is_object($element)) {
        $result[] = json_decode(json_encode($element), true);
    }
}

$finalJson = json_encode($finalArray);

http://sandbox.onlinephpfunctions.com/code/f4858bcc87da34e4ee6639b2ee96c7ac3244ae1b

И вы дадите ожидаемый результат:

[{"score":15,"win":true,"device":"Android SDK built for x86"},{"score":"Finish","device":"Android SDK built for x86","win":true},{"win":true,"score":"Finish","device":"Android SDK built for x86"},{"score":16,"scenario":"Finish","win":true,"device":"Android SDK built for x86"}]
0 голосов
/ 12 июня 2019

Просто сделай это. Вы можете добавить свою собственную обработку ошибок, но базовая должна выглядеть так:

$final_array = array();
$first_json = file_get_contents("test3.json");
$second_json = file_get_contents("my-file.json");

$first_array = json_decode($first_json,true);
$second_array = json_decode($second_json,true);

if(is_array($first_array) and is_array(second_array)){
    $final_array = array_merge(first_array,second_array);
}
else if(!empty($first_array) and is_array($first_array)){
    $final_array = $first_array;
}
else if(!empty(second_array) and is_array(second_array)){
    $final_array = second_array;
}

$final_json = json_encode(final_array);

file_put_contents("test3.json", final_json);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...