Skip to content

Instantly share code, notes, and snippets.

@branneman
Created May 2, 2011 16:18
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save branneman/951858 to your computer and use it in GitHub Desktop.
Save branneman/951858 to your computer and use it in GitHub Desktop.
Split a array into semi-equal sized chunks
<?php
/**
* Split a array into semi-equal sized chunks.
* A so-called 'columnizer'
*
* @param array $array The array to split
* @param array $numberOfChunks The number of chunks
* @param bool $vertical Whether to order vertically or horizonally
*
* @return array Array with $numberOfColumns nodes with items of $array
*
* @author Bran van der Meer <branmovic@gmail.com>
* @since 08-02-2010
*/
function arrayEqualChunks($array, $numberOfChunks = 2, $vertical = true)
{
if ($vertical) {
$perColumn = floor(count($array) / $numberOfChunks);
$rest = count($array) % $numberOfChunks;
$perColumns = array();
for ($i = 0; $i < $numberOfChunks; $i++) {
$perColumns[$i] = $perColumn + ($i < $rest ? 1 : 0);
}
foreach ($perColumns as $rows) {
for ($i = 0; $i < $rows; $i++) {
$data[$i][] = array_shift($array);
}
}
} else {
$i = 0;
foreach ($array as $node) {
$data[$i][] = $node;
$i = ($i >= ($numberOfChunks - 1) ? 0 : $i + 1);
}
}
return $data;
}
<?php
// Vertical example
echo '<pre style="background-color:#aaf">';
$data = arrayEqualChunks(range(1, 31), 7);
foreach ($data as $row) {
foreach ($row as $node) {
printf('[%2s]', $node);
}
echo "\n";
}
echo '</pre>';
<?php
// Horizontal example
echo '<pre style="display:table;width:100%;background-color:#afa">';
$data = arrayEqualChunks(range(1, 33), 5, false);
foreach ($data as $col) {
echo '<div style="float:left;width:20%">';
foreach ($col as $node) {
printf("%2s\n", $node);
}
echo '</div>';
}
echo '</pre>';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment