Как обновить декодированный массив JSON новым массивом в PHP? - PullRequest
0 голосов
/ 21 сентября 2018

Мне нужно знать, как обновить декодированный массив JSON новыми значениями (хотя я не имею в виду простое array_push).

Я собираюсь опубликовать свой код, вот мой Users.json file:

[
{
  "objID":"Y0FVVFZYCV",

  "createdOn":{"type":"__date","date":"2018-09-21T16:48:09"},
  "string":"lorem ipsum"
},
{
  "objID":"YShAUqIcMg",
  "username":"johndoe", // new key->value here!
  "createdOn":{"type":"__date","date":"2018-09-21T16:48:14"},
  "string":"lorem ipsum"
}
]

Вот мой create.php файл, где я использовал для добавления объектов JSON из строки URL:

// Prepare data to be saved:
if(!empty($_GET)){
    foreach($_GET as $key => $value) {

        // Random objID
        $objects->objID = generateRandomID();

        // Number       
        if( is_numeric($value) ){
            $objects->$key = (float) $value;

        // Boolean
        } else if($value === 'true'){
            $objects->$key = true;
        } else if($value === 'false'){
            $objects->$key = false;

        // ClassName
        } else if ($key === 'className'){

        // String
        } else { $objects->$key = $value; }


        // createdOn & updatedOn Dates
        $objects->createdOn = array('type'=>'__date','date'=>$formattedDate);
        $objects->updatedOn = array('type'=>'__date','date'=>$formattedDate);

    }// ./ foreach


    // Save data into the JSON file
    $jsonStr = file_get_contents($className.'.json');
    // Decode the JSON string into a PHP array.
    $jsonObjs = json_decode($jsonStr, true);

    // Check if there's some new key and values -> update the $jsonObjs array
    $result = array_diff($jsonObjs, $objects);
    print_r('<br><br>DIFFERENCE: <br>'.$result[0].'<br>');

    // Push array       
    array_push($jsonObjs, $objects);
    // Encode the array back into a JSON string and save it.
    $jsonData = json_encode($jsonObjs);
    file_put_contents($className.'.json', $jsonData);
    // echo JSON data
    echo $jsonData;

Я пытаюсь получить разницу между $jsonObjs и $objects с array_diff():

 $result = array_diff($jsonObjs, $objects);
 print_r(.$result[0].'<br>');

но это не работает, показывает пустую строку, а также файл error_log показывает это:

PHP Warning:  array_diff(): Argument #2 is not an array on line 63

Я запускаю2 строки URL, первая из которых начинается с

create.php?className=Users&string=lorem%20ipsum

Во 2-й я добавляю дополнительный строковый объект, например:

create.php?className=Users&string=lorem%20ipsum&username=johndoe

Итак, мне нужно добитьсядобавить ключ «username» в 1-й объект, как это делается для 2-го объекта.Другими словами, мой Users.json файл должен выглядеть следующим образом после запуска второй строки URL:

[
    {
      "objID":"Y0FVVFZYCV",
      "username":"", //<-- upodated key with no value
      "createdOn":{"type":"__date","date":"2018-09-21T16:48:09"},
      "string":"lorem ipsum"
    },
    {
      "objID":"YShAUqIcMg",
      "username":"johndoe", // new key->value here!
      "createdOn":{"type":"__date","date":"2018-09-21T16:48:14"},
      "string":"lorem ipsum"
    }
    ]

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Как указал мой @ miken32, мой объект $ objects был не массивом, а объектом StdClass, поэтому мне просто пришлось заменить:

$objects->

на:

$objects[$key]

Таким образом, $objects становится допустимым массивом, и я могу использовать array_diff () следующим образом:

$result = array_diff_assoc($jsonObjs, $objects);
print_r('DIFF: '.json_encode($result).'<hr>');

Он печатает действительный массив JSON.

0 голосов
/ 21 сентября 2018

Как уже указывалось в комментариях, вы не можете передать "$ objects" в функцию array_diff, потому что она ожидает массив, а "$ objects" - это, в общем, Object.

You может привести ваш объект к массиву, вызвав его следующим образом:

$result = array_diff($jsonObjs, (array)$objects);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...