Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,将数组中的随机偶数分配给列表数组?_Php_Arrays_Random - Fatal编程技术网

在PHP中,将数组中的随机偶数分配给列表数组?

在PHP中,将数组中的随机偶数分配给列表数组?,php,arrays,random,Php,Arrays,Random,我有两个数组。一个数组$People当前创建44个个体。让我们假设它现在 $People=array('1','2',…,'44') 我还有一个15个元素的数组 $Test=array('A','B',…'O') 现在我希望能够将测试随机分配给每个人。我知道如何在php中使用随机函数来实现这一点 这对我来说很棘手,我需要帮助的是如何平衡测试阵列。我的意思是,由于目前有44个个体(这个阵列在未来会增长),我希望14个测试版本有3个个体,1个版本有2个。所以我想让测试阵列平衡。我还希望它能够随着$P

我有两个数组。一个数组
$People
当前创建44个个体。让我们假设它现在

$People=array('1','2',…,'44')

我还有一个15个元素的数组

$Test=array('A','B',…'O')

现在我希望能够将测试随机分配给每个人。我知道如何在php中使用随机函数来实现这一点

这对我来说很棘手,我需要帮助的是如何平衡测试阵列。我的意思是,由于目前有44个个体(这个阵列在未来会增长),我希望14个测试版本有3个个体,1个版本有2个。所以我想让测试阵列平衡。我还希望它能够随着
$People
数组的增长而处理

例如:测试版本D将有单独的'4','25'。每隔一个版本有三个随机个体

我提出的一些想法是,在
$Test
数组上运行随机整数,哪个最高/最低得到2个个体,其余3个。当我增加
$People
数组的大小时,会出现问题;为了解决这个问题,我想先用模来计算一下
$Test的偶数


我可以做到这一点和其他想法,但我确信一定有更好的方法来做到这一点。

我相信这就是你想要做的

假设您有$people和$test数组。你想知道每次测试有多少人

$ppt = ceil(sizeof($people)/sizeof($test));
现在,$ppt是每次测试的人数。下一步是将这些人随机分配到测试中

shuffle($people);
现在,我们可以将人员分成子数组,这样每个子数组都被分配给一个测试。记住,现在块是随机的,因为我们洗牌了

$chunks = array_chunk($people, $ppt);

现在,$chunks[0]中的每个人都将参加$test[0]。$chunk[1]中的每个人都将参加$test[1]。$chunk[2]中的每个人都将参加$test[2]。

澄清您的情况:

您希望在
$Test
数组中随机分配
$People
中的值。您所说的问题是,
$People
中的值的数量并不总是可以完全除以
$Test
中的值的数量,并且您不确定如何实现代码来均匀分布值

建议的解决方案:

您可以从无序版本的
$People
中逐个随机获取
foreach
循环中的值,并将它们放入名为
$Result
的新数组中。如果已从无序排列的
$People
数组中提取所有值,则还将进行条件检查:
if($count>=$arrayCount)
其中
$arrayCount=$count($shuffledPeople)。如果已获得所有值,则首先将
$bool
值设为false(以便不再在
while
循环中迭代,然后将
foreach
循环中中断;

$Result =[];//the array containing the results
$shuffledPeople = $People;
shuffle($shuffledPeople);//mixing up the array
$arrayCount = count($shuffledPeople);//finding the total amount of people
$count = 0;
$bool = TRUE;

while ($bool)
{
foreach($Test as $value)
  {
    $Result[$value][] =  $shuffledPeople[$count];
    $count++;
    if ($count>=$arrayCount)
    {
      $bool = FALSE;
      break;
    }
  }
}
要查看结果,您只需执行以下操作:

foreach ($Result as $key => $value)
{
  echo "{$key}: <br>";
  if (is_array($value))
  {
    foreach ($value as $something)
    {
      echo "-->{$something}<br>";
    }
  }
  else
  {
    echo "-->{$value}<br>";
  }
}
foreach($Result as$key=>$value)
{
回声“{$key}:
”; if(是_数组($value)) { foreach($something的值) { 回声“->{$something}
”; } } 其他的 { echo“->{$value}
”; } }
我的答案对你有用吗?我一直在“$Result[$Test]=$shuffledPeople[$Count];”@USER420编辑我的代码,忘记在
$Result[$Test]之后添加
[]
仍然是相同的错误。$Test和$People都是字符串数组。@USER420 k 1秒,我将在我的站点上运行代码,看看有什么改进。这很有趣,因为我刚刚要提到它,因为$Unit是数组。谢谢,它工作了44。我所做的是将我的People数组的大小更改为34,看看它是否工作,但失败了这里。我的$chunks是一个长度为12的二维数组,而我的$Test数组的长度为14。这意味着永远不会给出两个测试版本的测试。这是设计的。有34人和14个测试,最公平的划分方法是11个测试中的3人,1个测试中的1人。这就剩下2个测试未使用。如果你想这样做的话确保每个测试都被使用,在进行$ppt计算时使用floor而不是ceil,然后将$chunks数组的late元素一个接一个地分布在测试上。