在 Laravel 中找出 json 的差异

Finding differences in json in Laravel

我是 Laravel 的初学者。 我在 Laravel 8,

申请

我在数据库中有这个值:

$json = {
    "old": {
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:07:41.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 3, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2,
        "selected_products": "[1,3]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
    }, 
    "attributes": {
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": 
        "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:09:08.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 4, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2, 
        "selected_products": "[1,3,2]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5,6,4]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
        }
    }

我需要显示与 OLD 和 Attributes 的不同之处。 我怎样才能做到?

请帮帮我。

如何通过json_decode将其转换为数组,然后使用array_diff呢? 像这样:

$json = json_decode('{"old": {"id": 1, "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", "car_id": 2, "comments": "uwagi", "driver_id": 1, "address_to": "adres dostawy", "carrier_id": 22, "company_id": 1, "created_at": "2022-04-14T09:07:41.000000Z", "data_start": "2022-04-01", "deleted_at": null, "updated_at": "2022-04-14T09:07:41.000000Z", "carrier_nip": "728-597-9477", "data_finish": "2022-04-04", "address_from": "adres wyjazdu", "carrier_city": "Lake Emersonville", "carrier_name": "Satterfield, Lebsack and OConner", "order_number": "Numer zlecenia", "speed_number": "Numer zlecenia speed - spedycja", "carrier_email": "mattie50@gmail.com", "carrier_phone": "347.731.2768 x1508", "dispatcher_id": 3, "carrier_street": "6342 Pollich Crossroad", "selected_files": "[7,8,9]", "transport_type": 2, "deliver_comments": null, "transport_status": 3, "is_neutral_option": 2, "selected_products": "[1,3]", "transport_content": "kontakt", "delivery_signature": null, "selected_documents": "[5]", "carrier_postal_code": "36804-7962", "hidden_carrier_data": 0, "delivery_name_surname": null, "delivery_signature_binary": null, "disable_change_status_driver": 0}, "attributes": {"id": 1, "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", "car_id": 2, "comments": "uwagi", "driver_id": 1, "address_to": "adres dostawy", "carrier_id": 22, "company_id": 1, "created_at": "2022-04-14T09:07:41.000000Z", "data_start": "2022-04-01", "deleted_at": null, "updated_at": "2022-04-14T09:09:08.000000Z", "carrier_nip": "728-597-9477", "data_finish": "2022-04-04", "address_from": "adres wyjazdu", "carrier_city": "Lake Emersonville", "carrier_name": "Satterfield, Lebsack and OConner", "order_number": "Numer zlecenia", "speed_number": "Numer zlecenia speed - spedycja", "carrier_email": "mattie50@gmail.com", "carrier_phone": "347.731.2768 x1508", "dispatcher_id": 4, "carrier_street": "6342 Pollich Crossroad", "selected_files": "[7,8,9]", "transport_type": 2, "deliver_comments": null, "transport_status": 3, "is_neutral_option": 2, "selected_products": "[1,3,2]", "transport_content": "kontakt", "delivery_signature": null, "selected_documents": "[5,6,4]", "carrier_postal_code": "36804-7962", "hidden_carrier_data": 0, "delivery_name_surname": null, "delivery_signature_binary": null, "disable_change_status_driver": 0}}', true);

var_dump(array_diff($json['old'], $json['attributes']));

结果我得到:

array(2) {
  ["selected_products"]=>
  string(5) "[1,3]"
  ["selected_documents"]=>
  string(3) "[5]"
}

您可以使用 array_diff https://www.php.net/manual/en/function.array-diff.php

<?php

$json = '{
    "old": {
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:07:41.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O\'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 3, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2,
        "selected_products": "[1,3]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
    }, 
    "attributes": {
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": 
        "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:09:08.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O\'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 4, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2, 
        "selected_products": "[1,3,2]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5,6,4]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
        }
    }';
    
$array = \json_decode($json, true);
$diff = \array_diff($array['old'], $array['attributes']);

\var_dump($diff);

这将输出:

array(2) {
  ["selected_products"]=>
  string(5) "[1,3]"
  ["selected_documents"]=>
  string(3) "[5]"
}

在此处查看示例https://3v4l.org/A3ck7

我为你写了一个代码,它只 returns 数组中的差异。 array_diff() 似乎是一个不错的选择,但是 运行 我的脚本,它发现了比 array_diff() 方法更多的差异。

注意 我在 foreach 循环中严格比较,但我假设数据来自相同的 table,只是不同的记录,所以类型应该无关紧要。无论如何,如果你想要所有的差异,那么IMO严格比较是可行的方法。

$differences = [];
$json = '{"old": {"id": 1, "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", "car_id": 2, "comments": "uwagi", "driver_id": 1, "address_to": "adres dostawy", "carrier_id": 22, "company_id": 1, "created_at": "2022-04-14T09:07:41.000000Z", "data_start": "2022-04-01", "deleted_at": null, "updated_at": "2022-04-14T09:07:41.000000Z", "carrier_nip": "728-597-9477", "data_finish": "2022-04-04", "address_from": "adres wyjazdu", "carrier_city": "Lake Emersonville", "carrier_name": "Satterfield, Lebsack and O\'Conner", "order_number": "Numer zlecenia", "speed_number": "Numer zlecenia speed - spedycja", "carrier_email": "mattie50@gmail.com", "carrier_phone": "347.731.2768 x1508", "dispatcher_id": 3, "carrier_street": "6342 Pollich Crossroad", "selected_files": "[7,8,9]", "transport_type": 2, "deliver_comments": null, "transport_status": 3, "is_neutral_option": 2, "selected_products": "[1,3]", "transport_content": "kontakt", "delivery_signature": null, "selected_documents": "[5]", "carrier_postal_code": "36804-7962", "hidden_carrier_data": 0, "delivery_name_surname": null, "delivery_signature_binary": null, "disable_change_status_driver": 0}, "attributes": {"id": 1, "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", "car_id": 2, "comments": "uwagi", "driver_id": 1, "address_to": "adres dostawy", "carrier_id": 22, "company_id": 1, "created_at": "2022-04-14T09:07:41.000000Z", "data_start": "2022-04-01", "deleted_at": null, "updated_at": "2022-04-14T09:09:08.000000Z", "carrier_nip": "728-597-9477", "data_finish": "2022-04-04", "address_from": "adres wyjazdu", "carrier_city": "Lake Emersonville", "carrier_name": "Satterfield, Lebsack and O\'Conner", "order_number": "Numer zlecenia", "speed_number": "Numer zlecenia speed - spedycja", "carrier_email": "mattie50@gmail.com", "carrier_phone": "347.731.2768 x1508", "dispatcher_id": 4, "carrier_street": "6342 Pollich Crossroad", "selected_files": "[7,8,9]", "transport_type": 2, "deliver_comments": null, "transport_status": 3, "is_neutral_option": 2, "selected_products": "[1,3,2]", "transport_content": "kontakt", "delivery_signature": null, "selected_documents": "[5,6,4]", "carrier_postal_code": "36804-7962", "hidden_carrier_data": 0, "delivery_name_surname": null, "delivery_signature_binary": null, "disable_change_status_driver": 0}}';
$jsonArray = json_decode($json, true);

// Assuming that $jsonArray["old"] and $jsonArray["attributes"] have the same elements
foreach ($jsonArray["old"] as $key => $value) {
    if ($value !== $jsonArray["attributes"][$key])
        $differences[$key] = [
            "old" => $value,
            "attributes" => $jsonArray["attributes"][$key]
        ];
}

我得到的结果:

Array
(
    [updated_at] => Array
        (
            [old] => 2022-04-14T09:07:41.000000Z
            [attributes] => 2022-04-14T09:09:08.000000Z
        )

    [dispatcher_id] => Array
        (
            [old] => 3
            [attributes] => 4
        )

    [selected_products] => Array
        (
            [old] => [1,3]
            [attributes] => [1,3,2]
        )

    [selected_documents] => Array
        (
            [old] => [5]
            [attributes] => [5,6,4]
        )
)

首先,你必须将两个对象分成两个子对象 1是旧的,2是属性

喜欢:

$old = '{
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:07:41.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O\'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 3, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2,
        "selected_products": "[1,3]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
    }'; 

 $attribute = '{
        "id": 1, 
        "hash": "19f149b6-f7e2-4d61-b3c5-d46ebc92f681", 
        "car_id": 2, 
        "comments": "uwagi", 
        "driver_id": 1, 
        "address_to": 
        "adres dostawy", 
        "carrier_id": 22, 
        "company_id": 1, 
        "created_at": "2022-04-14T09:07:41.000000Z", 
        "data_start": "2022-04-01", 
        "deleted_at": null, 
        "updated_at": "2022-04-14T09:09:08.000000Z", 
        "carrier_nip": "728-597-9477", 
        "data_finish": "2022-04-04", 
        "address_from": "adres wyjazdu", 
        "carrier_city": "Lake Emersonville", 
        "carrier_name": "Satterfield, Lebsack and O\'Conner", 
        "order_number": "Numer zlecenia", 
        "speed_number": "Numer zlecenia speed - spedycja", 
        "carrier_email": "mattie50@gmail.com", 
        "carrier_phone": "347.731.2768 x1508", 
        "dispatcher_id": 4, 
        "carrier_street": "6342 Pollich Crossroad", 
        "selected_files": "[7,8,9]", 
        "transport_type": 2, 
        "deliver_comments": null, 
        "transport_status": 3, 
        "is_neutral_option": 2, 
        "selected_products": "[1,3,2]", 
        "transport_content": "kontakt", 
        "delivery_signature": null, 
        "selected_documents": "[5,6,4]", 
        "carrier_postal_code": "36804-7962", 
        "hidden_carrier_data": 0, 
        "delivery_name_surname": null, 
        "delivery_signature_binary": null, 
        "disable_change_status_driver": 0
        }';

之后:

$old_array = json_decode($old, TRUE);
$attribute_array = json_decode($attribute, TRUE);
$result_array = array_diff($old_array,$attribute_array);
    
    
if(!empty($result_array[0])){     
    echo "They are different";
}

它将像使用旧数组和属性数组时一样工作

旧数组有 ABC 键而属性数组没有然后它会显示消息

我们正在使用 json_decode,它将用于将 JSON 转换为关联数组,您必须将 true 作为第二个属性传递才能使其关联

也许会有帮助