Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Join 如何在Lua中连接两个表(带有子表)_Join_Lua_Lua Table - Fatal编程技术网

Join 如何在Lua中连接两个表(带有子表)

Join 如何在Lua中连接两个表(带有子表),join,lua,lua-table,Join,Lua,Lua Table,我正试图加入Lua的两个表。基本上,我想将一个表的内容附加到另一个表的末尾。我发现有很多代码可以实现这一点,但当表中有其他表作为值(我相信它们被称为子表)时,它就不起作用了 我发现这个问题很相似: 除了第二个表中的内容外,那里的代码工作正常,正在覆盖第一个表。但我不希望覆盖第一个表中的条目。我只希望第二个表中的所有内容都附加在第一个表中的内容之后。但我不知道该怎么做 因此,当我的第一张桌子看起来与此相似时: { Category = { Answer = "String",

我正试图加入Lua的两个表。基本上,我想将一个表的内容附加到另一个表的末尾。我发现有很多代码可以实现这一点,但当表中有其他表作为值(我相信它们被称为子表)时,它就不起作用了

我发现这个问题很相似:

除了第二个表中的内容外,那里的代码工作正常,正在覆盖第一个表。但我不希望覆盖第一个表中的条目。我只希望第二个表中的所有内容都附加在第一个表中的内容之后。但我不知道该怎么做

因此,当我的第一张桌子看起来与此相似时:

   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   },
   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   }
我的第二个也是一样,我想以:

   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   },
   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   },
   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   },
   { Category = 
      { Answer = "String",
        Answer = "String"
      }
   }
如何做到这一点

我使用以下代码从XML文件动态构建这些表:

这是我的XML文件结构:

<?xml version="1.0" encoding="utf-8"?>
<library>
    <gametype1>
        <category name="">
            <answer></answer>
            <answer></answer>
            <answer></answer>
        </category>
        <category name="">
            <answer></answer>
            <answer></answer>
            <answer></answer>
        </category>
    </gametype1>

    <gametype2>
        <category name="">
            <answer></answer>
            <answer></answer>
            <answer></answer>
        </category>
        <category name="">
            <answer></answer>
            <answer></answer>
            <answer></answer>
        </category>
    </gametype2>
</library>
我现在想做的是连接这些表,这样我只有一个gametype1数据表和一个gametype2数据表

因此,当我通过#gameAnswers1Gametype1.category访问数据表时,我得到了正确的条目数。对于我用于测试的当前XML文件,file1.XML在gametype1节点中有9个类别节点,file2.XML在gametype1节点中有1个类别节点。所以我希望当我完成时,在连接的表中会有10个类别节点

(如果这很重要,我会用Corona SDK来完成这项工作。)


任何帮助都将不胜感激

以非破坏性方式连接多个表:

function table.concat(...)
  local r, n, t = {}, 1, {...}
  for i = 1, select('#', ...) do
    local t = t[i]
    if t then
      for i = 1, #t do
        r[n], n = t[i], n + 1
      end
    end
  end
end

此解决方案允许将一个表与其自身连接起来,同时忽略附加的哈希键和省略的表。

您将从XML库中收到的两个文件的结构如下

{ 
    library = 
    {
        gametype1 =
        {
            category =
            {
                { -- category[1]
                    name="name1",
                    answer = {"ans1", "ans2", "ans3"}
                },
                { -- category[2]
                    name="name2",
                    answer = {"ans1", "ans2", "ans3"}
                },
            }
        },
        gametype2 =
        {
            category =
            {
                { -- category[1]
                    name="name1",
                    answer = {"ans1", "ans2", "ans3"}
                },
                { -- category[2]
                    name="name2",
                    answer = {"ans1", "ans2", "ans3"}
                },
            }
        },
    }
}
您希望将table1.library.gametype1与table2.library.gametype1合并,并对table1和table2的gametype2执行相同的操作。由于在创建这两个表后不会更改它们,因此不需要深度复制:

local function concat(fromTable, intoTable) 
    local lenFrom = #fromTable
    for i = 1, lenFrom do 
        table.insert(intoTable, fromTable[i])
    end 
end

local gameAnswers1 = xml:loadFile( "file1.xml", system.ResourceDirectory )
local gameAnswers2 = xml:loadFile( "file2.xml", system.ResourceDirectory )

local gameType1A = gameAnswers1.library.gametype1
local gameType1B = gameAnswers2.library.gametype1
concat(gameType1B.category, gameType1A.category)
-- now table contains its categories plus all those of table2
local tableGameType1 = gameType1A 

local gameType2A = gameAnswers1.library.gametype2
local gameType2B = gameAnswers2.library.gametype2
concat(gameType2B.category, gameType2A.category)
-- now table1 contains its categories plus all those of table2
local tableGameType2 = gameType2A 

请注意,gameAnswers1现在包含两个文件中的所有类别

{Category={Answer=“String”,Answer=“String”}
{Category={Answer=“String”}}
table_append=函数(t1,t2)对于i=1,#t2 do t1[#t1+1]=t2[i]end
Egor,我只是将那个XML示例用作结构示例。每个表的“字符串”值不同。请在连接前显示表的预打印,以及结果应该如何。你看,从来没有两个表条目具有相同的键?下一步,更正上面的示例。我发现了一些不同的XML解析代码,可以很好地简化数据结构。让我试试,看看这是否改变了什么。我相信我也可以轻松打印表格。@GDOG可以更具体一些,比如你遇到的错误或问题,或者你是否用其他评论/答案解决了这个问题?谢谢@scholli,我还在我的原始帖子中添加了更多关于表格和数据结构的信息。我认为问题可能在于XML解析器正在创建的表的绝对复杂性。这里没有绝对的复杂性,所有这些都是可以管理的,但是请告诉我您是想将t1+t2放在t3中(因此t1和t2保持不变),还是想用t2的内容扩展t1(因此t2保持不变,但t1发生了变化,并且没有t3)?同样,在您的第一条评论中,您说“当我尝试访问表中的XML节点时,我得到一个nil值”:请显示用于执行此操作的代码。然后我将相应地编辑我的答案。我愿意创建一个新的组合数据表,或者只是在第一个表中添加第二个表中的数据。我不会编辑/更改任何数据。它只是用来阅读和显示的。在我上面添加的代码中,您可以看到我的“测试”是什么。我在gametype1节点中有9个类别节点的file1.xml。我在gametype1节点中有file2.xml和一个category节点。无论我在这个过程中创建(或更新)了什么表,我都希望在执行35; gameAnswers1Gametype1.category时得到10的结果。这有意义吗?再次谢谢你,@scholli。我非常感谢你的帮助,但那也没用。我对本地tableGameType1=table1和本地tableGameType2=table1行感到困惑,因为我不确定table1应该引用什么。但既然你说gameAnswers1现在拥有所有类别,我试着检查#gameAnswers1.library.gametype1.category,结果是原来的数字9。因此gameAnswers2中的1没有被添加到其中,我可以通过将表转储到控制台并从file2.xml中搜索一个唯一字符串来确认这一点。谢谢@Deduplicator,但与Scholli的示例一样,我没有收到任何错误,但是当我尝试按条目数访问数据时,返回的数字是第一个表中的数字。第二个表中的内容不存在。
local function concat(fromTable, intoTable) 
    local lenFrom = #fromTable
    for i = 1, lenFrom do 
        table.insert(intoTable, fromTable[i])
    end 
end

local gameAnswers1 = xml:loadFile( "file1.xml", system.ResourceDirectory )
local gameAnswers2 = xml:loadFile( "file2.xml", system.ResourceDirectory )

local gameType1A = gameAnswers1.library.gametype1
local gameType1B = gameAnswers2.library.gametype1
concat(gameType1B.category, gameType1A.category)
-- now table contains its categories plus all those of table2
local tableGameType1 = gameType1A 

local gameType2A = gameAnswers1.library.gametype2
local gameType2B = gameAnswers2.library.gametype2
concat(gameType2B.category, gameType2A.category)
-- now table1 contains its categories plus all those of table2
local tableGameType2 = gameType2A