首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel中寻找json的差异

在Laravel中寻找json的差异
EN

Stack Overflow用户
提问于 2022-04-14 09:13:20
回答 4查看 64关注 0票数 -1

我是拉勒维尔的初学者。我在Laravel 8公司申请,

我在DB中有这个值:

代码语言:javascript
复制
$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
        }
    }

我需要显示出与过去和属性不同的地方。我怎么能做到呢?

请帮帮我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-04-14 09:37:42

我为您编写了一个代码,它只返回数组中的差异。array_diff()似乎是一个很好的替代方案,但是运行我的脚本,它发现了比array_diff()方法更多的差异。

注意到,我严格地在foreach循环中进行比较,但是我假设数据来自同一个表,只是不同的记录,所以类型不重要。不管怎么说,如果你想要有所有的差异,那么海事组织严格比较是可行的。

代码语言:javascript
复制
$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]
        ];
}

结果我得到:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2022-04-14 09:26:15

如何通过json_decode将其转换为数组,然后使用array_diff?如下所示:

代码语言:javascript
复制
$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']));

结果我得到:

代码语言:javascript
复制
array(2) {
  ["selected_products"]=>
  string(5) "[1,3]"
  ["selected_documents"]=>
  string(3) "[5]"
}
票数 1
EN

Stack Overflow用户

发布于 2022-04-14 09:34:42

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

代码语言:javascript
复制
<?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);

它的产出:

代码语言:javascript
复制
array(2) {
  ["selected_products"]=>
  string(5) "[1,3]"
  ["selected_documents"]=>
  string(3) "[5]"
}

参见这里的示例https://3v4l.org/A3ck7

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71869190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档