Разделение списка строк на новые списки одинаковой длины

Скажем, у меня есть список из 65 строк.
Мне нужно разделить этот список на несколько «пулов», которые имеют одинаковое количество строк.
Сумма не может быть больше 32.

В этом списке из 65, они все с 1 по 65 место.

  • Для списка из 65 строк он будет разделен на один пул из 21 и два пула по 22.
  • Для списка из 34 строк он будет разделен на один пул из 18 и один пул из 18.
  • Для списка из 115 строк он будет разделен на один пул из 28 и три пула из 29.

И так далее.

Тем не менее, новые списки должны быть справедливо ранжированы.
В примере это должно быть так:

  • 1 место в пуле 1
  • 2 место в пуле 2
  • 3 место в пуле 3
  • 4 место в пуле 1
  • 5 место в пуле 2
  • 6 место в пуле 3

Таким образом, ранг 1 и ранг 4 становятся рангом 1 и 2 в их новом списке.
То же самое относится и к остальным.

Я думаю, что мне нужно использовать array_chunk в сочетании с операцией по модулю, но я не могу обернуться вокруг нее.

0

Решение

Это не так сложно, как может показаться:

// 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>';

Я уверен, что есть другие решения, но это, кажется, делает работу.

0

Другие решения

Я думаю, что вы на правильном пути, используя array_chunk и операцию по модулю, я бы выбрал именно это.

Это было бы как:

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

}
$newpool = array_chunk($myarray, $modulo);

Я не бог в php, поэтому я надеюсь, что это поможет! Извините за мой плохой английский.

0

По вопросам рекламы [email protected]