Hi
You could also consider a port expander chip, such as the MCP23017.
This connects to the Arduino using the 2-wire I2C bus. You can connect multiple chips in parallel to the same 2 wires and talk to each one separately.
Each pin is configurable as input or output. The current each pin can handle is lower than for an Arduino pin, but would be enough to drive an LED.
You asked about arrays. They could well be useful in your situation. As an example, checking the current state of each button and saving it in an array element for later processing, using a for loop, would take less code than assigning the button values to separate variables - and it would be easier to spot bugs than with lots of similar repeated code - and it would be easier to change the code if you need to.
And 2D arrays are also possible. Again, depends on what your program logic does, and whether the relationship between rows and columns is significant.
All the best
Ray