Unlike arrays in many other languages, in many cases Mathematica allows you to deal with lists of data without the need for indexes at all. Lists can be of variable depth and lengths if you need them to be.
cities = {"NewYork","LosAngeles","Chicago"};
costs = {{1,2}, {3,4},{5,6}};
Transpose[{cities, costs}]
This gives you a list of cities and associated information, in this case costs.
{{NewYork, {1, 2}}, {LosAngeles, {3, 4}}, {Chicago, {5, 6}}}
You could then extract the biggest cost for each city by something along these lines:
{First@#, Max@Last@#} & /@ Transpose[{cities, costs}]
{{NewYork, 2}, {LosAngeles, 4}, {Chicago, 6}}
which works by applying the unnamed function {First@#, Max@Last@#} & over the list of city cost using the Map function, which here is written as /@. The element # here stands for the function argument, which Map replaces with each element, in turn, of the list it is applied to.
This is a common programming pattern in Mathematica and can be used to great effect to achieve many tasks that would require a loop construct in other languages.