Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Lua中遍历表?_Arrays_Loops_Lua_Key_Lua Table - Fatal编程技术网

Arrays 如何在Lua中遍历表?

Arrays 如何在Lua中遍历表?,arrays,loops,lua,key,lua-table,Arrays,Loops,Lua,Key,Lua Table,我有一张桌子,大概是这样的: arr = { apples = { 'a', "red", 5 }, oranges = { 'o', "orange", 12 }, pears = { 'p', "green", 7 } } 似乎不可能基于索引访问它们,而值本身就是表,所以我只是将嵌套表的第一个值作为它的索引,所以现在看起来像这样: arr = { apples = { 0, 'a', "red", 5 }, oranges = { 1, 'o', "orange", 1

我有一张桌子,大概是这样的:

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],但当然有时必须同时键入这两个键。

如果要通过多个键引用嵌套表,可以将它们分配给单独的键。这些表没有重复,仍然引用相同的值

arr = {}
apples = {'a', "red", 5 }
arr.apples = apples
arr[1] = apples
此代码块允许您遍历表()中的所有键值对:


要迭代表中的所有键值对,可以使用

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
  apples  a   red     5
  oranges o   orange  12
  pears   p   green   7
编辑:请注意,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
产出:

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

这里的所有答案都建议使用ipairs,但请注意,它并非始终有效

t = {[2] = 44, [4]=77, [6]=88}

--This for loop prints the table
for key,value in next,t,nil do 
  print(key,value) 
end

--This one does not print the table
for key,value in ipairs(t) do 
  print(key,value) 
end

对于那些想知道为什么ipairs不会一直打印表中所有值的人,下面是原因(我会对此进行评论,但我没有足够的好分数)

函数ipairs仅适用于具有键为1的元素的表。如果存在键为1的元素,IPAIR将尝试按顺序(1->2->3->4等)尽其所能,直到找不到键为序列中下一个键的元素为止。元素的顺序并不重要

不符合这些要求的表格将无法与IPAIR一起使用,而是使用配对

示例:

ipairsCompatable = {"AAA", "BBB", "CCC"}
ipairsCompatable2 = {[1] = "DDD", [2] = "EEE", [3] = "FFF"}
ipairsCompatable3 = {[3] = "work", [2] = "does", [1] = "this"}

notIpairsCompatable = {[2] = "this", [3] = "does", [4] = "not"}
notIpairsCompatable2 = {[2] = "this", [5] = "doesn't", [24] = "either"}
ipairs将尽可能地进行迭代,但不会迭代表中的任何其他元素

kindofIpairsCompatable = {[2] = 2, ["cool"] = "bro", [1] = 1, [3] = 3, [5] = 5 }
打印这些表时,这些是输出。我还包括了用于比较的成对输出

ipairs + ipairsCompatable
1       AAA
2       BBB
3       CCC

ipairs + ipairsCompatable2
1       DDD
2       EEE
3       FFF

ipairs + ipairsCompatable3
1       this
2       does
3       work

ipairs + notIpairsCompatable

pairs + notIpairsCompatable
2       this
3       does
4       not

ipairs + notIpairsCompatable2

pairs + notIpairsCompatable2
2       this
5       doesnt
24      either

ipairs + kindofIpairsCompatable
1       1
2       2
3       3

pairs + kindofIpairsCompatable
1       1
2       2
3       3
5       5
cool    bro

刚刚注意到。。。为什么打印顺序不对?如果它按顺序打印,我可以在表中省去index变量,只依赖它打印的顺序来查找索引,这很好。Lua不能保证表的关联部分的迭代顺序。@Lemony我添加了一个示例,说明如何以特定顺序遍历表。@HenrikErlandsson-JSON对象是无序的。请参阅。当Crockford写“一个对象是一组无序的名称/值对”时,他指的是一个JSON字符串表示一个对象,该对象具有不应依赖其顺序的对。然而,JSON是一种文本交换格式,人们所谓的“JSON对象”实际上只是一个字符串,所以是的,它是按顺序排列的。我个人认为“JSON对象”一词用得太多了。Henrik认为有人想要按照JSON字符串中给出的顺序进行迭代是正确的,但这确实是一个“错误”的想法!除非每个数组行之间有一个“,”符号,否则使用@greatwolf的答案将失败
arr={apples={0',a',red',5},oranges={1',o',orange',12},pears={2',p',green',7},}
可以看到一个工作示例:@KjellHedström我已经编辑了OP的问题并修复了一些小的语法错误。接得好。为什么不一直打印呢?我是Lua的初学者。我不知道。但是我在测试代码时遇到了这个问题。@sgowd为什么要在表“t”之后添加“nil”-这不是必需的。另外,您提到的问题(实际上不是问题)是IPAIR返回一组基于整数的键。这意味着,如果您的表具有基于字符串的键,则使用IPAIR将它们转换为整数键。文档非常清楚地描述了这一差异。@SeniruPasan感谢您提供的关于不添加'nil'的提示;我会试试看。在我给出的示例中,键是基于整数的键。巴格夫的回答更清楚地解释了为什么ipairs不能一直工作。