2013-07-02 15 views
30

So habe ich einen Tisch etwas in diese Richtung:Wie man in Lua durch die Tabelle iteriert?

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

Es scheint nicht, wie es möglich ist, sie auf ihrem Index für den Zugriff auf der Grundlage, und die Werte selbst Tabellen sind, so dass ich nur den ersten Wert der Index der es der verschachtelten Tabelle, so dass es so aussieht jetzt:

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

so, jetzt jedes Mal wenn ich eine dieser Tabellen verwenden, weiß ich, was der Index ist, aber immer noch nicht an das bekommen Tabelle, die den Index verwendet, also habe ich angefangen, eine Funktion zu schreiben, die sie alle durchläuft und die Indizes überprüft, bis sie den richtigen findet. Dann habe ich gemerkt ... wie kann ich sie durchlaufen, wenn ich nicht schon nach ihrem Index darauf verweisen kann? Also, jetzt stecke ich fest. Ich möchte die meiste Zeit arr.apples vs arr [1] eingeben können, aber natürlich ist es notwendig, beides zu tun.

+1

dies mit antwortet @greatwolf fehl, es sei denn es gibt eine "" zwischen jeder Array-Reihe. '' 'arr = { Äpfel = {0, 'a'," rot ", 5}, Orangen = {1, 'o'," Orange ", 12}, Birnen = {2, 'p', "grün", 7}, } '' 'ein funktionierendes Beispiel kann gesehen werden: http://ideone.com/yWKHx7 –

+0

@ KjellHedström Ich habe die Frage des OP bearbeitet und die kleinen Syntaxfehler behoben. guter Fang. – greatwolf

Antwort

52

iterieren alle Schlüssel-Wert-Paare in einer Tabelle können Sie pairs verwenden :

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

Ausgänge:

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

Bearbeiten: Beachten Sie, dass Lua keine Iterationsreihenfolge für den assoziativen Teil der Tabelle garantiert. Wenn Sie auf die Elemente in einer bestimmten Reihenfolge zugreifen möchten, rufen Sie die Schlüssel unter ab und sortieren Sie sie. Dann den Zugriff durch die arr sortiert Schlüssel:

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 

Ausgänge:

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

Gerade bemerkt ... warum druckt sie in der falschen Reihenfolge? Wenn es in der Reihenfolge gedruckt wird, könnte ich die Indexvariable in der Tabelle weglassen und sich nur auf die Reihenfolge verlassen, die es druckt, um den Index zu finden, was nett wäre. –

+2

Lua garantiert nicht die Iterationsreihenfolge für den assoziativen Teil der Tabelle. – greatwolf

+1

@Lemony Ich habe ein Beispiel hinzugefügt, wie Sie die Tabelle in einer bestimmten Reihenfolge durchlaufen können. – greatwolf

8

Wenn Sie mit mehreren Schlüsseln auf eine verschachtelte Tabelle verweisen möchten, können Sie sie einfach separaten Schlüsseln zuweisen. Die Tabellen sind nicht dupliziert und verweisen immer noch auf die gleichen Werte.

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

Dieser Codeblock können Sie durch alle Schlüssel-Wert-Paare in einer Tabelle iterieren (http://lua-users.org/wiki/TablesTutorial):

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