我试图通过为从 1 到 2 的每个任务生成随机数来随机分配两个人的任务。
问题是我有重复的任务。 如何为重复项生成相同的数字而不必删除它们? 示例:
<?php
$tasks = array('task1','task4','task2','task3','task4','task3','task4','task5');
foreach($tasks as $task)
{
$rand = rand(1,2);
$array = array('task' => $task,'rand'=> $rand);
echo $array['task']."==>";
echo $array['rand']."<br>";
}
?>
答案 0 :(得分:2)
$tasks = array('task1', 'task4', 'task2', 'task3', 'task4', 'task3', 'task4', 'task5');
$output = [];
foreach ($tasks as $task) {
if (!isset($output[$task])) {
$output[$task] = rand(1, 2);
}
}
结果:var_dump($output);
array (size=5)
'task1' => int 2
'task4' => int 2
'task2' => int 2
'task3' => int 1
'task5' => int 1
获取某个任务的编号:
var_dump($output['task3']);
int 1
这很容易使用,但重复项将被删除。正如你所说,你不喜欢那样。 (但会更容易)
您需要一个包含任务和编号的新数组。
$tasks = array('task1', 'task4', 'task2', 'task3', 'task4', 'task3', 'task4', 'task5');
$numbers = []; // saving the random number, so the same task will get the same number
$result = [];
foreach ($tasks as $task) {
if (isset($result[$task])) {
$number = $numbers[$task];
} else {
$number = rand(1, 2);
$numbers[$task] = $number;
}
$result[] = [
'task' => $task,
'number' => $number,
];
// or $result[] = $number;
// then only the number is saved at the position of $task
}
结果var_dump($result);
array (size=8)
0 =>
array (size=2)
'task' => string 'task1' (length=5)
'number' => int 2
1 =>
array (size=2)
'task' => string 'task4' (length=5)
'number' => int 1
2 =>
array (size=2)
'task' => string 'task2' (length=5)
'number' => int 2
3 =>
array (size=2)
'task' => string 'task3' (length=5)
'number' => int 2
4 =>
array (size=2)
'task' => string 'task4' (length=5)
'number' => int 1
5 =>
array (size=2)
'task' => string 'task3' (length=5)
'number' => int 2
6 =>
array (size=2)
'task' => string 'task4' (length=5)
'number' => int 1
7 =>
array (size=2)
'task' => string 'task5' (length=5)
'number' => int 1
答案 1 :(得分:0)
您可以使用 array_fill_keys()
创建一个以所有任务为键的数组,然后使用 array_walk()
为所有键分配随机数。
$tasks = array('task1','task4','task2','task3','task4','task3','task4','task5');
//use the tasks as keys for a new array. Duplicates will be filtered out.
$task_rand = array_fill_keys( $tasks, false );
//then "walk" the new array, assigning a randum number to each task
array_walk($task_rand, function(&$value){$value= rand(1,2);});
//sort the array, so task1 comes before task2 etc
ksort($task_rand);
The result of `$task_rand`:
Array
(
[task1] => 2
[task2] => 1
[task3] => 2
[task4] => 1
[task5] => 1
)