比较具有 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
]
]
我有两个数组: 订单项目:
[
{
"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
]
]