如何用PHP中的新数组更新解码的JSON数组?

时间:2018-09-21 17:11:24

标签: php json database

我需要知道如何用新值更新解码的JSON数组(不过,我并不是说简单的array_push)。

我要发布代码,这是我的Users.json文件:

[
{
  "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文件,用于从URL字符串添加JSON对象:

// 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来了解$objectsarray_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

在第二个中,我添加了一个附加的字符串对象,如下所示:

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

因此,我需要实现的是也将“ username”键添加到第一个对象中,就像在第二个对象上一样。换句话说,启动第二个URL字符串后,我的Users.json文件应如下所示:

[
    {
      "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 :(得分:1)

正如注释中已经指出的那样,您不能将“ $ objects”传递给array_diff函数,因为它期望一个数组,而“ $ objects”是一个对象。

可以通过如下调用对象来将其转换为数组:

$result = array_diff($jsonObjs, (array)$objects);

答案 1 :(得分:0)

正如我的@ miken32所指出的那样,我的$ objects对象不是一个数组,而是一个StdClass对象,因此我只需要替换:

$objects->

具有:

$objects[$key]

通过这种方式,$objects成为有效的数组,我可以像这样使用array_diff():

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

它会打印出有效的JSON数组。