Как сравнить 2 JSON, чтобы найти новые записи с глубиной? - PullRequest
0 голосов
/ 12 октября 2018

Я хочу сравнить 2 json, и если будет новый массив, он получит новый массив и вставит его в базу данных.

Это старый json,

[{"menu_id":"1","menu_name":"Rapat 2018","parent_id":"0","link":"informent.online","status":"1"},
{"menu_id":"3","menu_name":"Rapat 2019","parent_id":"0","link":"#","status":"1"}]

Thisэто новый json,

[{"menu_id":"1","menu_name":"Rapat 2018","parent_id":"0","link":"informent.online","status":"1","children":[{"menu_id":"","menu_name":"Rapat RW","parent_id":"1","link":"#","status":"1"}]},
{"menu_id":"3","menu_name":"Rapat 2019","parent_id":"0","link":"#","status":"1"}]

Существует новый массив от детей (menu_name: Rapat RW), я хочу получить этот новый массив, чтобы я мог вставить его в базу данных.

Этоэто то, что я сделал,

$json_str1 = '  [
                      {
                        "menu_id": "1",
                        "menu_name": "Rapat 2018",
                        "parent_id": "0",
                        "link": "informent.online",
                        "status": "1"
                      },
                      {
                        "menu_id": "3",
                        "menu_name": "Rapat 2019",
                        "parent_id": "0",
                        "link": "#",
                        "status": "1"
                      }
                    ]';
    $json_str2 = '  [
                      {
                        "menu_id": "1",
                        "menu_name": "Rapat 2018",
                        "parent_id": "0",
                        "link": "informent.online",
                        "status": "1",
                        "children": [
                          {
                            "menu_id": "",
                            "menu_name": "Rapat RW",
                            "parent_id": "1",
                            "link": "#",
                            "status": "1"
                          }
                        ]
                      },
                      {
                        "menu_id": "3",
                        "menu_name": "Rapat 2019",
                        "parent_id": "0",
                        "link": "#",
                        "status": "1"
                      }
                    ]';

    list($arr1, $arr2) = [json_decode($json_str1), json_decode($json_str2)];
    $common_items = array_intersect($arr2, $arr1);
    $result = array_filter(array_merge($arr1, $arr2), function($v) use($common_items){
        return !in_array($v, $common_items);
    });

    print_r($result);

Но я возвращаю ошибку "Объект класса stdClass не может быть преобразован в строку" из "Функция: array_intersect" В чем проблема?Любая помощь будет оценена!

1 Ответ

0 голосов
/ 12 октября 2018

Я вижу, что array_intersect сравнивает значения в виде строки.Таким образом ошибка массива в строку.Потому что одним из ваших значений является сам массив.Чтобы решить эту проблему, вы должны использовать array_uintersect

http://php.net/array_uintersect

function myFunction($value1, $value2) {
    //compare and return 1 or 0
    return (int) $value1 !== $value2; //for example
}
$common_items = array_uintersect($arr2, $arr1, "myFunction");
...