【发布时间】:2014-08-06 21:47:20
【问题描述】:
我正在建立一个礼品交换网站,人们在其中输入他们的电子邮件,然后每个参赛者与另一个参赛者(发件人)匹配。我正在使用 PHP(可能是 Symfony,如果它有所作为的话)。
我预计参赛人数在 600-800 人左右,并且会非常频繁地运行。
我想我可以在收件人数组上使用shuffle() 和array_combine() 来执行此操作。
但是,在shuffle() 之后,发件人仍可能处于相同位置,因此必须给自己一个秘密圣诞老人礼物。
例如:
$recipients = "SQL query that returns array"
# ['bob', 'alice', 'joe']
$senders = $recipients;
shuffle($senders);
# ['alice', 'bob', 'joe']
$result = array_combine($recipients, $senders);
# ['bob' => 'alice', 'alice' = 'bob', 'joe' => 'joe']
所以我需要保证在最终数组中,没有一个值等于键。到目前为止,我已经想到了以下可能的解决方案,但它们看起来都很昂贵而且有点垃圾:
- 在最终数组上使用
array_walk()。将任何值放入另一个数组,然后将它们相互交换。如果只有 1 个,只需将其与任何东西交换即可。 - 从
$recipients数组中获取所有具有偶数键的值,以及从$senders数组中获取所有具有奇数键的值。随机播放这两个数组。 - 而不是使用
shuffle()实现我自己的糟糕版本,它会执行类似将所有值向前移动两个,然后执行array_reverse()。 - 遍历收件人,并使用
array_rand()从$senders中选择一个项目。如果相同,请再次选择,否则将其从数组中删除,将其设置为该收件人的发件人,然后转到下一个收件人。
也许我想多了 - 有没有更简单的方法?或者有没有我不知道的 PHP 中的特殊方法?
【问题讨论】:
-
@Dagon 这个问题是关于从关联数组中删除重复的键值对。在这个问题中,我不是要删除重复项,而是要防止
shuffle()生成键等于值的数组。