array_chunk
не заполняет массивы равномерно, если общее количество элементов не делится на количество фрагментов, которое вы хотите; последний блок может быть намного меньше первого (например, если у вас есть семь элементов и вы разбили на три блока, вы получите массивы, содержащие три, три и один элемент).
Следующая реализация попытается сгладить это так, чтобы размеры массива были больше, даже если это то, что вам нужно, например если у вас есть семь элементов, вы получите массивы чанков, содержащие три, два и два элемента. Это все еще не даже, но это более равномерно. Он возвращается к использованию array_chunk
, если счет делится на число столбцов равномерно, так как это будет быстрее (особенно если у вас большие массивы).
<?php
function array_group($array, $num)
{
$num = (int) $num;
if ($num < 1) {
throw new \InvalidArgumentException('At least one group must be returned.');
}
$count = count($array);
if ($count && $count % $num === 0) {
return array_chunk($array, $count / $num);
}
$groups = [];
$offset = 0;
do {
$length = ceil(($count - $offset) / $num);
$groups[] = array_slice($array, $offset, $length);
$offset += $length;
} while (--$num);
return $groups;
}
print_r(array_chunk(array(1, 2, 3, 4, 5, 6, 7), 3));
/* Produces
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
[2] => 6
)
[2] => Array
(
[0] => 7
)
) */
print_r(array_group(array(1, 2, 3, 4, 5, 6, 7), 3));
/* Produces
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 4
[1] => 5
)
[2] => Array
(
[0] => 6
[1] => 7
)
) */