# Problem making an array of arrays (of arrays)

**URL:** <https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381>\
**Category:** Ruby\
**Created:** [March 19, 2010, 1:26am UTC](https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381 "2010-03-19T01:26:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![xiphr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/43a26b/32.png) [@xiphr](https://www.ruby-forum.com/u/xiphr)\
**Post date:** [March 19, 2010, 1:26am UTC](https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381/1 "2010-03-19T01:26:39Z")

</div>

Hey, bit of a ruby noob here 🙂

First, hello ruby-forum community.

So, here is my problem. I want to create a 5x5 grid, however, each of  
the ‘cells’ in the grid should be able to hold a variety of values.

Firstly, I started off with this:

```
@row_1 = ['x','x','x','x','x']
@row_2 = ['x','x','x','x','x']
@row_3 = ['x','x','x','x','x']
@row_4 = ['x','x','x','x','x']
@row_5 = ['x','x','x','x','x']
@grid = [@row_1,@row_2,@row_3,@row_4,@row_5]

```

So, obviously this creates a 5x5 grid, in which each of the ‘cells’ or  
@row\_1…5[1…5] == ‘x’.

I used to just alter the string value in each cell by using:

```
@grid[y][x] = 'new string'

```

But, I ultimately want each cell to be an array… So that I can push and  
pop their values as they change, and then the grid will always display  
the last value in the array, by using:

```
@row_1 = [array.last,array1.last,array2.last,array3.last]
#etc etc etc...

```

My problem then is, that I have a different variable name for each of  
the five points in each of the five rows.

So, the solution I really want is:

Is it possible to have a variable called, say… cellxx … Then, some  
piece of code that alters the xx part of the actual variable name  
itself?

Because, I’m going about implementing cell00, cell01, cell02, cell03 etc  
etc each as an array and my code is getting messy.

Please is there an (easier) way, to do what I want?

Sorry for the length of this, you can tell i’m new to ruby 🙂 Thanks!

---

<div class="post-metadata">

**Author:** ![xiphr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/43a26b/32.png) [@xiphr](https://www.ruby-forum.com/u/xiphr)\
**Post date:** [March 19, 2010, 5:12am UTC](https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381/2 "2010-03-19T05:12:23Z")

</div>

On Thu, Mar 18, 2010 at 6:26 PM, Cec T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> @row\_2 = [‘x’,‘x’,‘x’,‘x’,‘x’]  
> @grid[y][x] = ‘new string’
> 
> ## Sorry for the length of this, you can tell i’m new to ruby 🙂 Thanks!
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

Personally, I think I would opt for nested classes in this case, but if  
I  
understand your problem correctly, then this should do what you are  
asking.

# the 2d array of elements that are arrays

# each currently containing it’s yx location as a string

array = [[[“00”], [“01”], [“02”], [“03”], [“04”]],  
[[“10”], [“11”], [“12”], [“13”], [“14”]],  
[[“20”], [“21”], [“22”], [“23”], [“24”]],  
[[“30”], [“31”], [“32”], [“33”], [“34”]],  
[[“40”], [“41”], [“42”], [“43”], [“44”]]]

# go through the array and set variables to reference the individual

cells  
array.each\_with\_index do |row,y|  
row.each\_with\_index do |element,x|  
instance\_variable\_set “@array#{y}#{x}” , element  
end  
end

# show that we can access it as you describe

@array00 \<\< ‘a’  
@array01 \<\< ‘b’  
@array11 \<\< ‘c’  
@array22 \<\< ‘d’  
@array33 \<\< ‘e’  
@array43 \<\< ‘f’  
@array44 \<\< ‘g’

# format the output so that it is easier to see what we did

puts ‘[’  
array.each do |row|  
print ’ [ ’  
row.each do |col|  
printf ‘%-12s , ’ , col.inspect  
end  
puts ’ ]’  
end  
puts ‘]’

---

<div class="post-metadata">

**Author:** ![xiphr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/43a26b/32.png) [@xiphr](https://www.ruby-forum.com/u/xiphr)\
**Post date:** [March 19, 2010, 3:03pm UTC](https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381/3 "2010-03-19T15:03:01Z")

</div>

2010/3/19 Cec T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> @row\_2 = [‘x’,‘x’,‘x’,‘x’,‘x’]  
> @grid[y][x] = ‘new string’
> 
> So, the solution I really want is:
> 
> Is it possible to have a variable called, say… cellxx … Then, some  
> piece of code that alters the xx part of the actual variable name  
> itself?
> 
> Because, I’m going about implementing cell00, cell01, cell02, cell03 etc  
> etc each as an array and my code is getting messy.

It’s not a good idea to encode what is an index into the variable  
name. Rather you should use proper indexing.

> Please is there an (easier) way, to do what I want?

grid = Array.new(5) { Array.new(5) { [] } }

Now you can do

irb(main):006:0\> grid[1][2]  
=\> []  
irb(main):007:0\> grid[1][2] \<\< “dat”  
=\> [“dat”]  
irb(main):008:0\> grid[1][2]  
=\> [“dat”]  
irb(main):009:0\> grid[1][2] \<\< “foo”  
=\> [“dat”, “foo”]  
irb(main):010:0\> grid[1][2]  
=\> [“dat”, “foo”]

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![xiphr](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/x/43a26b/32.png) [@xiphr](https://www.ruby-forum.com/u/xiphr)\
**Post date:** [March 20, 2010, 2:00pm UTC](https://www.ruby-forum.com/t/problem-making-an-array-of-arrays-of-arrays/185381/4 "2010-03-20T14:00:47Z")

</div>

On Mar 18, 6:26 pm, Cec T. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> So, here is my problem. I want to create a 5x5 grid, however, each of  
> the ‘cells’ in the grid should be able to hold a variety of values.

rb(main):001:0\> a = Array.new(5){ Array.new(5) }  
=\> [[nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil,  
nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil]]

irb(main):002:0\> require ‘pp’; pp a  
[[nil, nil, nil, nil, nil],  
[nil, nil, nil, nil, nil],  
[nil, nil, nil, nil, nil],  
[nil, nil, nil, nil, nil],  
[nil, nil, nil, nil, nil]]  
=\> nil

That says:  
Create an array with 5 elements; for each of the five elements, call  
this block and use the return value for the value of the element. When  
you call the block, create a new array of 5 empty elements.

You also can use the index of the array in your block. For example:

irb(main):009:0\> CHARS = (‘A’…‘Z’).to\_a  
=\> [“A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”,  
“N”, “O”, “P”, “Q”, “R”, “S”, “T”, “U”, “V”, “W”, “X”, “Y”, “Z”]

irb(main):010:0\> excel = Array.new(5){ |row| Array.new(5){ |col|  
“#{CHARS[col]}#{row+1}” } }  
=\> [[“A1”, “B1”, “C1”, “D1”, “E1”], [“A2”, “B2”, “C2”, “D2”, “E2”],  
[“A3”, “B3”, “C3”, “D3”, “E3”], [“A4”, “B4”, “C4”, “D4”, “E4”], [“A5”,  
“B5”, “C5”, “D5”, “E5”]]

irb(main):012:0\> pp excel  
[[“A1”, “B1”, “C1”, “D1”, “E1”],  
[“A2”, “B2”, “C2”, “D2”, “E2”],  
[“A3”, “B3”, “C3”, “D3”, “E3”],  
[“A4”, “B4”, “C4”, “D4”, “E4”],  
[“A5”, “B5”, “C5”, “D5”, “E5”]]  
=\> nil

> So, the solution I really want is:
> 
> Is it possible to have a variable called, say… cellxx … Then, some  
> piece of code that alters the xx part of the actual variable name  
> itself?

That’s a bad solution. Programmatically create or modify your array in  
loops; don’t create explicit temporary variables you don’t need.  
Here’s another solution:

irb(main):013:0\> a = []  
=\> []

irb(main):014:0\> 5.times{ |i| a[i] = [] }  
=\> 5

irb(main):015:0\> a  
=\> [[], [], [], [], []]

irb(main):016:0\> a[2][3] = “hi”  
=\> “hi”

irb(main):017:0\> a  
=\> [[], [], [nil, nil, nil, “hi”], [], []]
