DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world
Split Array Into Smaller Arrays Of Equal Size
Split an array of elements into a set of smaller arrays of equal size. Extra elements are preferentially assigned to earlier arrays. If there are no elements in a given returned array it will be [] (empty array)
# use as standalone function
def chunk_array(array, pieces=2)
len = array.length;
mid = (len/pieces)
chunks = []
start = 0
1.upto(pieces) do |i|
last = start+mid
last = last-1 unless len%pieces >= i
chunks << array[start..last] || []
start = last+1
end
chunks
end
# use as array.chunk
class Array
def chunk(pieces=2)
len = self.length;
mid = (len/pieces)
chunks = []
start = 0
1.upto(pieces) do |i|
last = start+mid
last = last-1 unless len%pieces >= i
chunks << self[start..last] || []
start = last+1
end
chunks
end
end
Examples of use:
>> chunk_array [1,2,3,4,5,6], 2 => [[1, 2, 3], [4, 5, 6]] >> chunk_array [1,2,3,4,5,6], 3 => [[1, 2], [3, 4], [5, 6]] >> chunk_array [1,2,3,4,5,6], 4 => [[1, 2], [3, 4], [5], [6]] >> chunk_array [1,2,3,4,5,6,7,8,9,10], 4 => [[1, 2, 3], [4, 5, 6], [7, 8], [9, 10]] >> chunk_array [1,2,3], 4 => [[1], [2], [3], []] >> chunk_array [], 2 => [[], []]
if you prefer the second form (more ruby-ish, but not always appropriate)
>> [1,2,3,4,5,6,7,8,9,10].chunk => [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] >> [1,2,3,4,5,6,7,8,9,10].chunk 3 => [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
This is handy when used with a splat because you can do things like:
left, right = *chunk_array(all,2)






Comments
Snippets Manager replied on Wed, 2011/07/27 - 8:36am
a.each_slice(n).to_aAlexey Tarasevich replied on Wed, 2010/01/06 - 7:52pm
a.each_slice(n).map{|x|[x]}.reduce([], &:+)Alexey Tarasevich replied on Wed, 2010/01/06 - 7:52pm
def chunk n each_slice(n).reduce([]) {|x,y| x += [y] } endSnippets Manager replied on Mon, 2011/04/04 - 2:18pm
a.each_slice(n).mapSnippets Manager replied on Fri, 2006/06/02 - 8:45pm
function chunk_array($array, $pieces=2) { $len = count($array); $mid = ($len/$pieces); $chunks = array(); $start = 0; foreach (range(1, $pieces) as $i) { $last = $start + $mid; if ($len % $pieces < i) $last = $last-1; $chunk_length = $last - $start; if ($chunk_length < 0) $chunk_length = 0; $chunks[] = array_slice($array, $start, $chunk_length); $start = $last+1; } return $chunks; }Snippets Manager replied on Tue, 2007/12/04 - 2:28am
Snippets Manager replied on Tue, 2007/06/05 - 3:03pm
Joe McGlynn replied on Thu, 2007/02/15 - 3:43am