【发布时间】:2015-10-19 06:37:05
【问题描述】:
随着假期的临近,又到了捡稻草的时候了。我们总是从一个包含每个人名字的盒子里挑选一张纸。然而,今年我想通过使用 PHP 解决从框中选择自己名字的问题。
我有一个名称为 ex 的数组:
$names = [
'John',
'Jane',
'Joe',
'Matt',
'Steve',
'Anne',
'Karin'
];
对于这些名字中的每一个,我想随机选择 4 个名字,这样最后每个人就有 4 个名字,他们必须为这些名字买礼物。
问题
好吧,我被困住了。我已经想出了一百万种方法来做到这一点,但我就是想不出任何办法。
到目前为止我已经尝试过什么
- 使用 foreach
- 使用
array_rand() - 移动数组
这些问题是一个人不应该选择自己的名字,每个人都应该被选择的次数相同 (4)。
更新
已经发布了一些很棒的答案。我不确定这是否对每个人都公平。最后,每个人都应该从 4 个不同的人那里得到 4 个礼物。
我正在考虑将每个名称添加到 $names 数组 4 次,然后应用您的答案之一。我在这方面走在正确的轨道上吗?
更新 2
我现在尝试过的:
function select_rand($array, $exclude_array) {
$diff = array_diff($array, $exclude_array);
return $diff[array_rand($diff, 1)];
}
$workArray = [
'0' => $names,
'1' => $names,
'2' => $names,
'3' => $names,
];
foreach ($names as $k => $name) {
$i = 0;
$new[$name] = array();
while ($i < 4) {
$value = select_rand($workArray[$i], array_merge($new[$name], array($name)));
if (($key = array_search($value, $workArray[$i])) !== false) {
unset($workArray[$i][$key]);
}
$new[$name][] = $value;
$i++;
}
}
这仅在少数情况下有效。
【问题讨论】:
-
array_rand(),array_diff()