Lua Iterating tables


The Lua standard library provides a pairs function which iterates over the keys and values of a table. When iterating with pairs there is no specified order for traversal, even if the keys of the table are numeric.

for key, value in pairs(input_table) do
    print(key, " -- ", value)

For tables using numeric keys, Lua provides an ipairs function. The ipairs function will always iterate from table[1], table[2], etc. until the first nil value is found.

for index, value in ipairs(numeric_table) do
    print(index, ". ", value)

Be warned that iteration using ipairs() will not work as you might want on few occasions:

  • input_table has "holes" in it. (See the section on "Avoiding gaps in tables used as arrays" for more information.) For example:

    table_with_holes = {[1] = "value_1", [3] = "value_3"}
  • keys weren't all numeric. For example:

    mixed_table = {[1] = "value_1", ["not_numeric_index"] = "value_2"}

Of course, the following also works for a table that is a proper sequence:

for i = 1, #numeric_table do
    print(i, ". ", numeric_table[i])

Iterating a numeric table in reverse order is easy:

for i = #numeric_table, 1, -1 do
    print(i, ". ", numeric_table[i])

A final way to iterate over tables is to use the next selector in a generic for loop. Like pairs there is no specified order for traversal. (The pairs method uses next internally. So using next is essentially a more manual version of pairs. See pairs in Lua's reference manual and next in Lua's reference manual for more details.)

for key, value in next, input_table do
    print(key, value)