Chunk and transpose a flat array into rows with a specific number of columns



PHP Snippet 1:

$chunks = array_chunk($array, ceil(count($array) / $cols));

PHP Snippet 2:

array(array('A', 'B', 'C', 'D'), array('E', 'F', 'G'));

PHP Snippet 3:

array_unshift($chunks, null);
$chunks = call_user_func_array('array_map', $chunks);

// array(array('A', 'E'), array('B', 'F'), array('C', 'G'), array('D', NULL))

PHP Snippet 4:

$input = array('A', 'B', 'C', 'D', 'E', 'F', 'G');
$cols = 2;
$itemsCount = count($input);
$offset = ceil($itemsCount/$cols);

$result = array();
for($i = 0; $i < $itemsCount; ++$i) {
    if (isset($input[$i]) && isset($input[$i + $offset])) {
        $result[] = array($input[$i], $input[$i + $offset]);
    }
}

PHP Snippet 5:

$input = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; 
$cols = 2;

var_export(
    array_map(
        null,
        ...array_chunk($input, ceil(count($input) / 2))
    )
);
// [['A', 'E'], ['B', 'F'], ['C', 'G'], ['D', null]]

PHP Snippet 6:

$input = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; 
$cols = 2;

$rows = ceil(count($input) / $cols);
$result = [];
foreach ($input as $i => $value) {
    $result[$i % $rows][] = $value;
}
var_export($result);
// [['A', 'E'], ['B', 'F'], ['C', 'G'], ['D']]