2013-07-02 48 views
30

Vì vậy, tôi có một cái gì đó bảng cùng những dòng này:Làm cách nào để lặp qua bảng trong Lua?

arr = 
{ 
    apples = { 'a', "red", 5 }, 
    oranges = { 'o', "orange", 12 }, 
    pears = { 'p', "green", 7 } 
} 

Nó không có vẻ như nó có thể truy cập chúng dựa trên chỉ mục của họ, và các giá trị bản thân là bảng, vì vậy tôi chỉ cần thực hiện giá trị đầu tiên của bảng lồng nhau chỉ số của nó, vì vậy nó bây giờ trông như thế này:

arr = 
{ 
    apples = { 0, 'a', "red", 5 }, 
    oranges = { 1, 'o', "orange", 12 }, 
    pears = { 2, 'p', "green", 7 } 
} 

vì vậy, bây giờ bất cứ lúc nào tôi sử dụng một trong các bảng này, tôi biết những gì các chỉ số này, nhưng vẫn không thể đến được bằng cách sử dụng chỉ mục, vì vậy tôi bắt đầu viết một hàm lặp qua tất cả chúng và kiểm tra các chỉ mục cho đến khi nó tìm thấy một chỉ mục phù hợp. Sau đó, tôi nhận ra ... làm thế nào tôi có thể lặp qua chúng nếu tôi không thể đề cập đến chúng bằng chỉ mục của họ? Vì vậy, bây giờ tôi đang bị mắc kẹt. Tôi thực sự muốn có thể gõ arr.apples vs arr [1] hầu hết thời gian, nhưng tất nhiên nó là cần thiết để làm cả hai lần.

+1

này với câu trả lời từ @greatwolf sẽ thất bại trừ khi có một "" giữa mỗi mảng hàng. '' 'arr = { táo = {0, 'a'," đỏ ", 5}, cam = {1, 'o'," cam ", 12}, lê = {2, 'p', "xanh", 7}, } '' 'một ví dụ làm việc có thể được xem tại: http://ideone.com/yWKHx7 –

+0

@ KjellHedström Tôi đã chỉnh sửa câu hỏi của OP và sửa các lỗi cú pháp nhỏ. nắm bắt tốt. – greatwolf

Trả lời

52

Để lặp qua tất cả các cặp khóa-giá trị trong một bảng, bạn có thể sử dụng pairs :

for k, v in pairs(arr) do 
    print(k, v[1], v[2], v[3]) 
end 

kết quả đầu ra:

pears 2 p green 
apples 0 a red 
oranges 1 o orange 

Chỉnh sửa: Lưu ý rằng Lua không đảm bảo bất kỳ thứ tự lặp nào cho phần kết hợp của bảng. Nếu bạn muốn truy cập các mục theo một thứ tự cụ thể, hãy truy xuất các phím từ arr và sắp xếp nó. Sau đó truy cập vào arr thông qua các phím được sắp xếp:

local ordered_keys = {} 

for k in pairs(arr) do 
    table.insert(ordered_keys, k) 
end 

table.sort(ordered_keys) 
for i = 1, #ordered_keys do 
    local k, v = ordered_keys[i], arr[ ordered_keys[i] ] 
    print(k, v[1], v[2], v[3]) 
end 

kết quả đầu ra:

apples a red  5 
    oranges o orange 12 
    pears p green 7 
+0

Chỉ cần nhận thấy ... tại sao in chúng theo thứ tự sai? Nếu nó in chúng theo thứ tự, tôi có thể bỏ qua biến chỉ mục trong bảng, và chỉ dựa vào thứ tự mà nó in để tìm chỉ mục, điều đó sẽ tốt đẹp. –

+2

Lua không đảm bảo thứ tự lặp cho phần kết hợp của bảng. – greatwolf

+1

@Lemony Tôi đã thêm một ví dụ về cách bạn có thể duyệt bảng theo một thứ tự cụ thể. – greatwolf

8

Nếu bạn muốn tham khảo bảng lồng nhau bằng nhiều khóa, bạn có thể chỉ định chúng cho các khóa riêng biệt. Các bảng không bị trùng lặp và vẫn tham chiếu các giá trị giống nhau.

arr = {} 
apples = {'a', "red", 5 } 
arr.apples = apples 
arr[1] = apples 

khối mã này cho phép bạn lặp qua tất cả các cặp khóa-giá trị trong một bảng (http://lua-users.org/wiki/TablesTutorial):

for k,v in pairs(t) do 
print(k,v) 
end