比较具有 laravel 键值对的两个对象数组与不匹配的特定键和 return 键值

Compare two arrays of objects having key value pair in laravel with specific key and return key value that don't match

我有两个数组: 订单项目:

[
    {
        "id": 4,
        "cancel": 0,
        "deleted_at": null,
        "created_at": "2020-08-12T10:14:01.000000Z",
        "updated_at": "2020-08-12T10:14:01.000000Z"
    },
    {
          "id": 3,
          "cancel": 0,
          "created_at": "2020-08-12T10:14:56.000000Z",
          "updated_at": "2020-08-12T10:14:56.000000Z",
    }
]

订单就绪:

[
    {
        "id": 2,
        "order_item_id": 4,
        "date": "1962-04-13",
        "wages": 12,
        "deleted_at": null,
        "created_at": "2020-08-12T10:14:56.000000Z",
        "updated_at": "2020-08-12T10:14:56.000000Z",
    }  
]

所以我需要检查来自 OrderItem table 的 ID 和 OrderReady table 中的 order_item_id 和 return 来自 OrderItam table 以防 OrderReady table 中不存在该 ID。从上面的数据来看,return 记录了 OrderItem table 的 id 3,因为它没有出现在 OrderReady table 中。最快最有效的方法是什么?

这里有两个建议,告诉您如何操作。你会得到一种丑陋的方式和一种更漂亮的方式。

首先我们迭代所有项目并匹配现成的项目。如果未找到匹配项,将该项目添加到“未准备好项目”列表中,以供稍后处理。

$orderItems = [
    ['id' => 1], ['id' => 2], ['id' => 3]
];

$orderReadyItems = [
    ['order_item_id' => 1], ['order_item_id' => 3]
];

// Array for storing items that are not yet ready
$notReadyItems = [];

foreach($orderItems as $item) {
    $itemReady = false;
    // Iterate all ready items and attempt to find a match with item.
    foreach($orderReadyItems as $orderReadyItem) {
        if ($item['id'] === $orderReadyItem['id']) {
            $itemReady = true;
            break; // Stop iterating ready items if a match is found.
        }
    }

    // Add item to $notReadyItems array if no match is found.
    if ($itemReady === false) {
        $notReadyItems[] = $item;
    }
}

为了使它看起来更漂亮一些,我们可以利用一些 Collection 方法。因此,我们不是迭代所有准备好的项目,而是创建一个包含所有准备好的项目 ID 的数组,并在 orderItems 的过滤器中检查它,如下所示:

$readyItemIds  = collect($orderReadyItems)->pluck('order_item_id');
$notReadyItems = collect($orderItems)->filter(static function (array $item) use ($readyItemIds) {
    return !$readyItemIds->contains($item['id']);
});

倾倒 $notReadyItems 应该给你:

array:1 [
  0 => array:1 [
    "id" => 2
  ]
]