Search 如何在一个表中搜索另一个表中的值?

Search 如何在一个表中搜索另一个表中的值?,search,lua,lua-table,Search,Lua,Lua Table,这是一个简单的脚本,我正在为一个老派的泥巴游戏编写,供那些知道这是什么的人使用 基本上,我在搜索一个表(我从gmcp读取),并尝试搜索该表上的值,以查看它们是否与另一个表上的值匹配,我正在存储我要查找的值 我已经成功地用奇异值实现了这一点,只需使用一个“for”循环从gmcp获取值并将其存储为变量,然后使用另一个“for”循环搜索另一个表,查看是否有任何值与变量匹配 问题是,它只适用于一个单数值,如果我需要在该表中检查多个值,它将忽略所有其他值 我的代码如下: for _, v in pairs

这是一个简单的脚本,我正在为一个老派的泥巴游戏编写,供那些知道这是什么的人使用

基本上,我在搜索一个表(我从gmcp读取),并尝试搜索该表上的值,以查看它们是否与另一个表上的值匹配,我正在存储我要查找的值

我已经成功地用奇异值实现了这一点,只需使用一个“for”循环从gmcp获取值并将其存储为变量,然后使用另一个“for”循环搜索另一个表,查看是否有任何值与变量匹配

问题是,它只适用于一个单数值,如果我需要在该表中检查多个值,它将忽略所有其他值

我的代码如下:

for _, v in pairs(gmcptable) do
  checkvalue = v
end
for _, v in pairs(mytable) do
  if v == checkvalue then
    echo("yay")
  else
    echo("no!")
  end
end
这同样适用于只有一个值的gmcp表,但如果有更多值,则会失败。我试着这么做是为了

for _, v in pairs(gmcptable) do
  checkvalue = v
  for _, v in pairs(mytable) do
    if v == checkvalue then
      echo("yay")
    else
      echo("no!")
    end
  end
end
我希望它可以设置变量,运行第二个for循环来检查变量,然后在gmcp表上重复下一个值,因为这是一个for循环,第二个循环在循环内,但这也不起作用。我还尝试制作自己的函数来添加到混合中并简化它

function searchtable(table, element)
  for _, v in pairs(table) do
    if v == element then
      return true
    else
      return false
    end
  end
end

for _, v in pairs(gmcptable) do
  if searchtable(mytable, v) == true then
    echo("yay")
  else
    echo("no!")
  end
end
那也是一个半身像。。。我肯定我只是忽略了一些东西,或者显示出我是一个业余爱好者,但我已经在谷歌上搜索了很多东西,尝试了我能想到的一切,但我只是自学成才,直到最近才开始了解表格和for循环是如何工作的。希望有人能给我回复一些有用的东西

更新

@小猪好吧,gmcptable实际上是我在试图简化问题,让那些能回答编码问题的人知道。gmcptable实际上是我的客户端通过连接从游戏服务器接收的一长串表。实际上,我有3个表在解析数据。“gmcp.Char.Items.List.Items”、“gmcp.Char.Items.Add”和“gmcp.Char.Items.Remove”。现在,gmcp.Char.Items.List.Items是游戏中我所在房间中所有东西的列表。gmcp.Char.Items.Add是进入房间的所有物品的列表,每次除了其他玩家之外,任何物品进入房间时都会被发送,gmcp.Char.Items.Remove是相同的,但用于任何物品离开房间时。我正试图使用此信息创建一个目标表,该表将自动将所需目标添加到我的目标que中,如果目标不在房间中,则将其删除。房间列表(gmcp.Char.Items.list)仅在我进入或退出房间时更新,可能在我查看时更新,但现在我假设它在我查看时不会更新,因为这将是一个稍后要解决的另一个问题

我目前有一个简单的脚本,我的客户端ID作为触发器,当我登录到相关游戏时,该脚本设置为触发一次,该脚本定义保存值的表,我正在交叉引用gmcp表,以确定它是否是我想要添加到目标表中的信息,该脚本还将目标表定义为空,这是为了确保在会话期间,两个表都存在并且都已定义

然后,我添加了三个单独的脚本来解析三个gmcp表,并确定它们是否在我想要的目标表上,如果是,则添加它;如果是删除表,则检查它当前是否在目标表上,如果是,则删除它。下面,我将展示我正在使用的当前脚本(从昨天起已经更改了好几次,在我查看任何将来对此的回复之前可能会再次更改)。我还将包括一个关于gmcp表的示例,如果我当前从我的客户机看到任何错误或调试详细信息,我也将包括该示例

log on trigger

match on > ^Password correct\.     in perl regex

bashtargets = {}
bashlist = {
"a baby rat",
"a young rat",
"a rat",
"an old rat",
"a black rat"
}
(上述触发器似乎工作正常,我可以准确打印表格)

房间里的脚本

事件处理程序>gmcp.Char.Items.List

 for _, v in pairs(gmcp.Char.Items.List.items) do
    bashname = v.name
    bashid = v.id
    for _, v in pairs(bashlist) do
        if v == bashname then
            table.insert(bashtargets, bashid)
        end
    end
end
脚本添加检查

事件处理程序“gmcp.Char.Items.Add”

脚本删除检查

事件处理程序“gmcp.Char.Items.Remove”

gmcp表“gmcp.Char.Items”

我已经成功地解析了这些信息好几次,所以我得到了正确的表和语法,以及gmcp涉及到的内容。 使用这个方法,我也成功地使它发挥了一半的作用。目前的设置似乎一次捕获一个目标,即使有几十个,并添加一个,有时出于某种原因,它奇怪地添加了相同的目标3-5次,不知道为什么,还没能弄清楚

这两条错误消息已被我的客户端反复输出,但不知道如何处理它们,也不知道如何修复它们……“离开房间”和“进入房间”是当前分配给脚本的名称,用于在我的客户端的表中添加和删除数据

[ERROR:] object:<event handler function> function:<left the room>
<Lua error:[string "return left the room"]:1: '<eof>' expected near 'the'>
[ERROR:] object:<event handler function> function:<entered the room>
<Lua error:[string "return entered the room"]:1: '<eof>' expected near 'the'>
[错误:]对象:函数:
[错误:]对象:函数:
我不知道“虽然”是什么意思,也不知道为什么它会出现在“的”附近,但我的头都在砰砰作响

我可以通过我的客户机上的调试功能看到,所有的处理程序都是由服务器发送的,所以它不是gmcp…我实际上没有在调试功能上看到任何错误(顺便说一句,它与错误功能是分开的,错误功能一直在抛出我提到的其他两个错误)

无论如何,这是我的更新…希望能让一些人更好地处理我做错了什么,这样我就可以弄明白这一点,并学到新的东西


再次提前感谢您@Pieget为您提供的答案,我肯定从中学到了一些新的东西,并认为它非常有用。

在您的第一次尝试中,您有两个单独的循环。您为gmcptable中的每个元素覆盖checkvalue。一旦您输入第二个循环,checkvalue将在fir中具有最后一个指定的值所以您只有1个checkvalue,并且只在表中运行一次,就像只运行第二个循环一样

for _, v in pairs(gmcptable) do
  checkvalue = v
end
for _, v in pairs(mytable) do
  if v == checkvalue then
    echo("yay")
  else
    echo("no!")
  end
end
如果我明白你的意思,你的第二次尝试应该会成功
{
  Remove = {
    location = "room",
    item = {
      id = "150558",
      name = "a filthy gutter mutt",
      attrib = "m"
    }
  },
  Add = {
    location = "room",
    item = {
      id = "150558",
      name = "a filthy gutter mutt",
      attrib = "m"
    }
  },
   List = {
    location = "room",
    items = {
      {
        id = "59689",
        name = "a statue of a decaying gargoyle",
        icon = "profile"
      },
      {
        id = "84988",
         name = "a gas lamp"
       },
       {
        id = "101594",
        attrib = "t",
        name = "a monolith sigil",
        icon = "rune"
      },
      {
        id = "196286",
        name = "a wooden sign"
      },
      {
        id = "166410",
        name = "Lain, the Lamplighter",
        attrib = "m"
      }
    }
  }
}
[ERROR:] object:<event handler function> function:<left the room>
<Lua error:[string "return left the room"]:1: '<eof>' expected near 'the'>
[ERROR:] object:<event handler function> function:<entered the room>
<Lua error:[string "return entered the room"]:1: '<eof>' expected near 'the'>
for _, v in pairs(gmcptable) do
  checkvalue = v
end
for _, v in pairs(mytable) do
  if v == checkvalue then
    echo("yay")
  else
    echo("no!")
  end
end
for _, v in pairs(gmcptable) do
  checkvalue = v
  for _, v in pairs(mytable) do
    if v == checkvalue then
      echo("yay")
    else
      echo("no!")
    end
  end
end