用户 一对多分配 PHP

发布于 2022-09-12 02:17:48 字数 1451 浏览 19 评论 0

我这边有一个业务需求,就是有两种用户类别(第二种类别用户数远超第一类用户),然后需要根据他们所选的偏好和地区来进行匹配。

比如说A类用户:他们可以多选偏好,并且可以选择多个城市,例如下方示例的 userA1, userA2,
A类用户示例如下所示:

{
    label:'userA1', 
    type:1,
    like:['1', '4', '11'],
    like2:['3','14','15'],
    city:['1','2']
},
{
    label:'userA2', 
    type:1,
    like:['1', '11'],
    like2:['3','13'],
    city:['2', '3']
},
...

B类用户:他们只能选择单选偏好和城市,比如 userB1, userB2,
B类用户示例如下所示:

{
    label:'userB1',
    type:2,
    like:"1",
    like2:"3"
    city:"1"
},
{
    label:'userB2',
    type:2,
    like:"4",
    like2:"7"
    city:"6"
},
...

分配的时候就需要根据他们所选择的偏好来进行匹配,匹配规则:

  1. 双方用户必须匹配 city 字段;
  2. 优先双方匹配 like 字段,如果B类用户的 like 字段没有匹配到A类用户,则使用A类用户的 like2 字段来匹配,如果还没有就轮空;
  3. 每一个A类用户最多不能匹配超过5个B类用户,如果B类用户实在多,所有匹配的A类用户都匹配了5个时,继续1、2步骤进行分配直到所有B类用户分配完成。

我小伙伴的一个需求,稍微做了一下模糊处理,因为我主力语言是 Js, PHP 并不了解多少,所以提供了几个解决方案都被他否决了。
所以厚着脸皮来社区问问是不是有大佬能给个思路....

他觉得困难的地方就是A类用户三个属性都是多选的。

我说让他把A类用户按照 like 分组,添加 count 属性并以此排序,然后用B类用户一个一个去分配,如果分配成功就把对应的A类用户 count++,跑完全部 B类用户 不就好了。

但是他说不行,最后第三条规则他处理不来,最多做到不限数量分配,但是我没有 Get 到为啥不行的点,可能 Js 的编程思路和 PHP 的有点差异吧...

也许是可能会出现某一个A用户选择了全部偏好然后出现一柱擎天的情况???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

感情旳空白 2022-09-19 02:17:48

目测这个规则是为了:

  1. 保证 B 类用户能够至少匹配到一个 A 类用户
  2. 保证 B 类用户足够多的时候,大部分 A 类用户都能匹配到至少5个 B 类用户
  3. AB 用户都没有排序要求

所以你说的情况当然会出现。另外也没什么特别好的办法处理。

╄→承喏 2022-09-19 02:17:48

我也不会PHP,所以以下都是伪代码,但逻辑是一样的:
第一次循环:匹配 like
循环B {

循环A.filter(item => item.city.includes(B.city)) {
    if(A.like.includes(B.like) {
        匹配成功,在B中写一个匹配成功的标记,比如 { match:A }
        匹配成功的这个A放到A数组的末尾,避免总是优先命中这个A
        break
    }
}

}
第二次循环:匹配 like2
排除掉第一轮循环中已经命中的B,剩下B2,按同样的逻辑循环一次

按这样计算,如果仍然有一个A命中大量B,也是没办法的。因为上次命中后已经放到数组最后了,如果再次命中,只能说明其他A都不符合条件。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文