Try thinking of the game world as being a collection of collections. Restricting yourself to a single array representation can, beyond a certain point, make things harder instead of easier.
I find there is a tendency when using 'everything that is here' objects in arrays to start using pointers (or references or indices) between objects to express relationships - that makes saving and restoring map/world information much more difficult that it needs to be. The maps can quickly become 'brittle' and hard to track bugs can easily ruin your day.
As a mental exercise, try representing your game world as a relational database. The various relationships should quickly become apparent. You can borrow an idea from the RDBMS camp and use a unique identifier for each game object. Then you can express relationships as ID value collections.
The use of ID values together with treating your game world as a collection of collections, makes it much easier to reliably save and restore slices of game data such as level maps.
Tip: immutable coordinate objects and hash maps/sets are your friends.
Hope this helps,
Brian aka Omnivore - and Happy Holidays to all