数组键的随机数,重复的随机数

时间:2021-05-30 06:56:13

标签: php

我试图通过为从 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>";
}

?>

2 个答案:

答案 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
)