将字符串列表拆分为长度相似的新列表


Splitting a list of strings into new lists of similar length

假设我有一个65个字符串的列表
我需要将这个列表拆分为多个具有相似字符串数量的"池"
金额不能超过32。

在这份65人的名单中,他们都排在第1位到第65位。

  • 对于一个包含65个字符串的列表,它将分为一个21个池和两个22个池
  • 对于一个包含34个字符串的列表,它将分为一个包含18个字符串的池和一个包含18#字符串的池
  • 对于115个字符串的列表,它将分为一个28个池和三个29个池

等等。

然而,新的名单需要进行公平的排名
例如,它应该是这样的:

  • 池1中的排名1
  • 在池2中排名2
  • 在池3中排名第3
  • 在池1中排名4
  • 在池2中排名5
  • 在池3中排名第6

通过这种方式,排名1和排名4在他们的新列表中分别成为排名1和2
其他也一样。

我想我需要将array_chunk与模运算结合使用,但我似乎无法理解它。

这并不像看上去那么困难:

// settings
$cellCount   = 115;
$maxPoolSize = 32;
// create test array with numbered strings
$testArray = array_fill(1,$cellCount,'Cell ');
foreach ($testArray as $key => $value) $testArray[$key] .= $key;
// determine the number of pools needed
$arraySize   = count($testArray);
$poolCount   = ceil($arraySize/$maxPoolSize);
// fill the pools
$poolNo = 0;
foreach ($testArray as $cell)
{
  $poolArray[$poolNo][] = $cell;
  $poolNo++;
  if ($poolNo == $poolCount) $poolNo = 0;
}
// show result
echo '<pre>';
print_r($poolArray);
echo '</pre>';

我相信还有其他解决方案,但这似乎能起到作用。

我认为您的方法是正确的,使用array_chunk和模运算,这是我会选择的方法。

它会像:

$countarray = count($myarray);
$modulo = 2;
while ($countarray>32)
{
    $result = $countarray/$modulo;
    if($result>32)
    $modulo++;
}
$newpool = array_chunk($myarray, $modulo);

我不是php的神,所以我希望它会有所帮助!抱歉我英语不好。