Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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
Lua 如何同时迭代两个表_Lua - Fatal编程技术网

Lua 如何同时迭代两个表

Lua 如何同时迭代两个表,lua,Lua,对于Lua,我是一个新手,我很难确定如何同时迭代两个表。下面的代码演示了我要做的事情。一些解释 我有两个字符串 slug-带有a/b/c 保存-另一个具有相同形式的字符串,例如x/y/z 我所做的 将/字符上的两个字符串分开,得到两个表 迭代slug表,并将其每个部分放在另一个表slug中 如果slug中的元素包含连字符slugs则执行此操作时,不会获取一个条目,而是两个条目。因此,如果slug是hello/world/stackoverflow将生成一个slug表,其中包含三个元素:hel

对于Lua,我是一个新手,我很难确定如何同时迭代两个表。下面的代码演示了我要做的事情。一些解释

我有两个字符串

  • slug-带有
    a/b/c
  • 保存-另一个具有相同形式的字符串,例如
    x/y/z
  • 我所做的

  • 将/字符上的两个字符串分开,得到两个表

  • 迭代
    slug
    表,并将其每个部分放在另一个表
    slug

  • 如果
    slug
    中的元素包含连字符
    slugs
    则执行此操作时,不会获取一个条目,而是两个条目。因此,如果slug是
    hello/world/stackoverflow
    将生成一个
    slug
    表,其中包含三个元素:hello、world和stackoverflow

  • 但是,
    hello/world/stack overflow
    将生成一个包含四个元素的表:hello、world、stack和overflow

  • 问题

    我现在输出另一个表,
    parts
    ,它在原始
    hold
    表中的条目上建立索引。如果没有连字符驱动的拆分,则存在一对一的对应关系,并且
    部分包含

    {a:hello,b:world,c:stackoverflow}
    
    {a:hello,b:world,c:stack}
    
    但是,使用连字符,
    hello\world\stack overflow
    parts
    包含

    {a:hello,b:world,c:stackoverflow}
    
    {a:hello,b:world,c:stack}
    
    溢出永远不会成功。我怀疑,通过同时迭代两个表,可能有办法避免这种情况。然而,我无法理解如何/是否可以做到这一点。我试着跟着笔记进去,但没什么进展

    在理想情况下,我能做的是动态修改
    hold
    表,以便在其伙伴
    slug
    表的c位置检测到连字符时,它包含
    {a,b,c0,c1}

    有了这一修改,输出的
    零件
    表现在将包含

    {a:hello,b:world,c0:stack,c1:overflow}
    
    我应该提到,我使用的是Lua5.1,没有升级到最新版本的选项

    function explode(div,str)
     if (div=='') then return false end
     local pos,arr = 0,{};
     local part = "";
     for st,sp in function() return string.find(str,div,pos,true) end do
      part = string.sub(str,pos,st-1);
      if ((0 < string.len(part)) and ("rest" ~= part)) then
       table.insert(arr,part);
      end;
      pos = sp + 1
     end
     table.insert(arr,string.sub(str,pos))
     return arr
    end;
    
    function resolveParts(slug,holds)
     local parts,slugs = {},{};
    
     for i,s in pairs(slug) do
      if (string.find(s,'%-')) then
         s = explode('-',s);
         table.insert(slugs,s[1]);
         table.insert(slugs,s[2]);
      else
         table.insert(slugs,s);
        end;
    end;
    
    --slugs has **FOUR** elements since over-flow got broken up into two
    for i,hold in pairs(holds) do
     parts[hold] = slugs[i];
    end;
    --iterating on the "old" holds table will result in parts missing one entry
    

    使用@EtanReisner的建议,将连字符的值保留在表中。这样,通过在数据结构中明确关系,可以避免将键彼此关联(例如c0、c1)的问题。当您以后不得不使用这种编码关系(凌乱的凌乱代码)或当它因不同的输入而中断时(例如,
    hold='c/c5/a/a3'
    ),用字符串编码任何东西都会带来麻烦

    哪些产出:

    b   stack
    c1  over
    c2  flow
    a   hello
    

    @YuHao-我编辑了我的问题,以更好地解释期望的结果应该是什么。中间
    段塞的格式是一种要求吗?如果不是,我建议用两个字符串替换字符串
    overflow
    ,而用一个字符串表替换它,这样就得到
    slug={“hello”,“stack”,“over”,“flow”}
    这允许您在
    resolveParts
    中的子表上迭代,以获得所需的通用前缀。@EtanReisner-您的建议很可能就是解决方案。没有绝对要求
    slug
    包含元素的最终数量-需要时解析连字符。我想我可以测试
    slug
    的每个元素,当它们被发现是一个表时,输出两个值,
    c0
    c1
    。我打算把这个问题再公开一段时间。但是,建议你做什么作为答案,我至少会投赞成票。是的,想法是你的
    resolveParts
    循环将测试
    Slug
    中的值类型,当它是一个字符串时,表现正常,但当它是一个表时,它将添加另一个循环和一个计数器,以便输出
    c#=subtab[I]
    字段的数量尽可能多。感谢您提供的代码和精彩的解释。非常感谢。