计算Laravel中两个独立集合中重复值的总数



我有两个集合,C1和C2。这两个集合中的值来自同一个模型。集合的结构如下:

id, sender_id, receiver_id, status

c1的一个实例如下:

#items: array:3 [▼
0 => {#1417 ▼
+"id": 21
+"sender_id": 19
+"receiver_id": 13
+"status": "added"
+"created_at": "2022-08-09 19:28:24"
+"updated_at": "2022-08-09 19:28:24"
}
1 => {#1416 ▼
+"id": 22
+"sender_id": 19
+"receiver_id": 11
+"status": "added"
+"created_at": "2022-08-09 19:28:28"
+"updated_at": "2022-08-09 19:28:28"
}
2 => {#1419 ▼
+"id": 23
+"sender_id": 19
+"receiver_id": 12
+"status": "added"
+"created_at": "2022-08-09 19:28:32"
+"updated_at": "2022-08-09 19:28:32"
}
]
#escapeWhenCastingToString: false
}

C2的实例是:

#items: array:3 [▼
0 => {#1407 ▼
+"id": 24
+"sender_id": 18
+"receiver_id": 13
+"status": "added"
+"created_at": "2022-08-09 19:28:52"
+"updated_at": "2022-08-09 19:28:52"
}
1 => {#1398 ▼
+"id": 25
+"sender_id": 18
+"receiver_id": 11
+"status": "added"
+"created_at": "2022-08-09 19:28:57"
+"updated_at": "2022-08-09 19:28:57"
}
2 => {#1412 ▼
+"id": 26
+"sender_id": 18
+"receiver_id": 12
+"status": "added"
+"created_at": "2022-08-09 19:29:01"
+"updated_at": "2022-08-09 19:29:01"
}
]
#escapeWhenCastingToString: false
}

完成这一切的功能是:

public function mutualFriend(User $user)
{
$C1 = DB::table('friendships')->where('sender_id', auth()->id())->where('status', 'added')->get();
$C2 = DB::table('friendships')->where('sender_id', $user->id)->where('status', 'added')->get();
//3 should be calculated here
}

我想计算C1和C2集合中常见的所有receiver_id。在上面的例子中,计数应该是三个,因为在C1和C2集合中都有

个就我个人的发现而言,我尝试了堆栈溢出,但所有的答案都与只在一个集合中找到重复值有关。我试着搜索其他平台,如laracast、codegreeper等,但找不到我的具体答案。此处链接了一个解决方案,但该解决方案适用于简单的集合。我的问题包含需要pulk((方法的集合数组

给定数据:

$c1 = collect([
(object)[
"id" => 21,
"sender_id" => 19,
"receiver_id" => 13,
"status" => "added",
"created_at" => "2022-08-09 19:28:24",
"updated_at" => "2022-08-09 19:28:24",
],
(object)[
"id" => 22,
"sender_id" => 20,
"receiver_id" => 11,
"status" => "added",
"created_at" => "2022-08-09 19:28:28",
"updated_at" => "2022-08-09 19:28:28",
],
(object)[
"id" => 23,
"sender_id" => 21,
"receiver_id" => 12,
"status" => "added",
"created_at" => "2022-08-09 19:28:32",
"updated_at" => "2022-08-09 19:28:32",
]
]);
$c2 = collect([
(object)[
"id" => 24,
"sender_id" => 18,
"receiver_id" => 13,
"status" => "added",
"created_at" => "2022-08-09 19:28:52",
"updated_at" => "2022-08-09 19:28:52",
],
(object)[
"id" => 25,
"sender_id" => 18,
"receiver_id" => 11,
"status" => "added",
"created_at" => "2022-08-09 19:28:57",
"updated_at" => "2022-08-09 19:28:57",
],
(object)[
"id" => 26,
"sender_id" => 18,
"receiver_id" => 12,
"status" => "added",
"created_at" => "2022-08-09 19:29:01",
"updated_at" => "2022-08-09 19:29:01",
]
]);

您可以使用Laravel的Collections的CCD_;共享的";属性。但首先,您需要pluck()进行比较:

$mutualSenders = $c1->pluck('receiver_id')->intersect($c2->pluck('receiver_id'));

导致此集合的原因:

IlluminateSupportCollection {#3505
all: [
13,
11,
12,
],
}

然后,您可以简单地应用->count()来获得编号:

$mutualSendersCount = $c1->pluck('receiver_id')->intersect($c2->pluck('receiver_id'))->count();
// 3

有关所有可用收集方法的列表,请查看此处:

https://laravel.com/docs/9.x/collections#available-方法

使用方法参考:

https://laravel.com/docs/9.x/collections#method-拔出

https://laravel.com/docs/9.x/collections#method-交叉

https://laravel.com/docs/9.x/collections#method-计数


编辑:直接应用于您的代码:

public function mutualFriend(User $user) {
return DB::table('friendships')->where('sender_id', auth()->id())->where('status', 'added')
->pluck('receiver_id')
->intersect(DB::table('friendships')->where('sender_id', $user->id)->where('status', 'added')->pluck('receiver_id'));
}

使用Collection类中的方法intersect()

$common = $c1->intersect($c2);
dd($common);

最新更新