2013-07-02 3 views
30

그래서, 나는이 라인을 따라 테이블에 뭔가가 : 그것은 그들의 인덱스에 기반을 액세스 할 수처럼루아에서 테이블을 반복하는 방법은 무엇입니까?

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

그것은하지 않는 것, 그 자체가 테이블에있는 값을, 그래서 난 그냥 첫 번째 값을했다 중첩 테이블의 그것의 지수는 지금과 같습니다 그래서 : 그래서

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

, 지금은 이러한 테이블 중 하나를 사용할 때마다, 나는 인덱스가 무엇인지 만, 여전히 접근 할 수 없습니다 테이블을 인덱스를 사용하여, 그래서 그들 모두를 통해 루프 함수를 작성하고 올바른 하나를 찾을 때까지 인덱스를 확인하십시오. 그렇다면 나는 이미 인덱스를 통해 그들을 참조 할 수 없다면 어떻게해야할까요? 그래서, 지금은 붙어 있어요. 대부분의 경우 arr.apples vs arr [1]을 입력 할 수 있기를 정말로 원하지만, 물론 둘 다 할 필요가 있습니다.

+1

이것 @greatwolf에서 대답이있는 ","각 어레이 행 사이에 존재하지 않으면 실패 할 것이다. {0, 'a', "red", 5}, oranges = {1, 'o', "orange", 12}, 배 = {2, 'p', "green", 7}, }'''작동 예제는 http://ideone.com/yWKHx7에서 볼 수 있습니다. –

+0

@ KjellHedström OP의 질문을 편집하고 사소한 구문 오류를 수정했습니다. 좋은 캐치. – greatwolf

답변

52

당신은 pairs을 사용할 수있는 테이블에 걸쳐 모든 키 - 값 쌍을 반복하려면 :

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

이 코드 블록은 테이블 (http://lua-users.org/wiki/TablesTutorial)에있는 모든 키 - 값 쌍을 반복 할 수 있습니다 :

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

출력 :

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

편집 : Lua는 테이블의 연관 부분에 대한 반복 순서를 보장하지 않습니다. 특정 순서로 항목에 액세스하려면 arr에서 키를 검색하고 정렬하십시오. 이어서 정렬 키를 통해 액세스 arr :

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 

출력 :

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

그냥 눈치 ... 왜 순서가 잘못 인쇄됩니까? 순서대로 인쇄했다면 테이블의 인덱스 변수를 생략하고 인덱스를 찾기 위해 인쇄하는 순서에만 의존 할 수 있습니다. –

+2

Lua는 테이블의 연관 부분에 대한 반복 순서를 보장하지 않습니다. – greatwolf

+1

@Lemony 특정 순서로 테이블을 탐색하는 방법에 대한 예제를 추가했습니다. – greatwolf

8

여러 개의 키로 중첩 된 테이블을 참조하려는 경우 별도의 키에 할당 할 수 있습니다. 테이블은 중복되지 않으며 여전히 동일한 값을 참조합니다.

for k,v in pairs(t) do 
print(k,v) 
end 
관련 문제