如何按照确切的顺序迭代表?

时间:2015-06-22 08:23:23

标签: loops for-loop lua

如果我尝试输出这个表,它们会以错误的顺序循环:

DIN1   hi
AIN1   my
AIN2    name
DIN2   is

预期产出:

AIN1    my
DIN2    is
DIN1    hi
AIN2    name

输出:

    if($con->connect_error){
    $response['success'] =0;
    $response['message'] ='could not connect to database';
    print(json_encode($response));
    die(print(json_encode($response)));
}

$response['success'] =1;
$response['message'] ='successfully connected to the database';
print(json_encode($response));


$depart = $_GET['depart'];
$destination = $_GET['destination'];
$sql = "INSERT INTO request (dateNtime, depart, destination, status) VALUES (now(),$depart,$destination,0)"; 
$mysql=mysqli_query($con,$sql);

if($mysql)
{
    echo "successfully";
}
else
{
    echo mysqli_error($con);
}

mysqli_close($con);

我如何编码它以便for循环贯穿表的实际顺序? (顺序如何定义)

编辑:我不需要字母顺序,但需要与表格定义中的顺序相同。

编辑:我需要输入密钥和值。在答案中,Lua成对出现与其编写的相同的顺序"将只有indexnumber和值打印

4 个答案:

答案 0 :(得分:2)

您可以使用表格的整数部分按顺序存储密钥:

function add(t, k, v, ...)
    if k ~= nil then
        t[k] = v
        t[#t+1] = k
        return add(t, ...)
    end
    return t
end

t = add({ }, "A", "hi", "B", "my", "C", "name", "D", "is")

for i,k in ipairs(t) do
    local v = t[k]
    print(k, v)
end

当然,这假设除add之外的任何内容都不使用整数键。

insert(t, k, v)remove(t, k)留给读者练习。

编辑: add函数中的省略号(点)允许根据需要传递尽可能多的参数以一次设置多个kv对。没有它,我们只能为每个呼叫设置一对,如add(t, "A", "hi")。函数定义add(t, k, v, ...)将前三个参数分配给t, k, v,并使其他参数保持不变。然后add处理第一对(t[k]=v)并使用其余...个参数进行递归。

          t   k    v    ...
level 1: (t, "A", "hi", "B", "my", "C", "name", "D", "is")
level 2: (t,         <- "B", "my", "C", "name", "D", "is")
level 3: (t,                    <- "C", "name", "D", "is")
level 4: (t,                                 <- "D", "is")
level 5: (t,                                          <- )

在第5级,kvnil s,因为参数列表太短,递归停止。

答案 1 :(得分:2)

解决此特定问题的Lua-users wiki has a page

从该页面引用代码:

--[[
Ordered table iterator, allow to iterate on the natural order of the keys of a
table.

Example:
]]

function __genOrderedIndex( t )
    local orderedIndex = {}
    for key in pairs(t) do
        table.insert( orderedIndex, key )
    end
    table.sort( orderedIndex )
    return orderedIndex
end

function orderedNext(t, state)
    -- Equivalent of the next function, but returns the keys in the alphabetic
    -- order. We use a temporary ordered key table that is stored in the
    -- table being iterated.

    key = nil
    --print("orderedNext: state = "..tostring(state) )
    if state == nil then
        -- the first time, generate the index
        t.__orderedIndex = __genOrderedIndex( t )
        key = t.__orderedIndex[1]
    else
        -- fetch the next value
        for i = 1,table.getn(t.__orderedIndex) do
            if t.__orderedIndex[i] == state then
                key = t.__orderedIndex[i+1]
            end
        end
    end

    if key then
        return key, t[key]
    end

    -- no more value to return, cleanup
    t.__orderedIndex = nil
    return
end

function orderedPairs(t)
    -- Equivalent of the pairs() function on tables. Allows to iterate
    -- in order
    return orderedNext, t, nil
end

不是键的自然顺序这里意味着你从最小的键开始(好像由a < b样式比较确定),这不一定是你先写的键在填写表格时你的代码(确定后者更复杂,更不合理)。

然后,您只需使用orderedPairs功能作为pairs的替代品:

local letters   =   {A="hi", B= "my", C ="name", D="is"}

for name, value in orderedPairs(letters) do
    print(name,value)
end

答案 2 :(得分:2)

记录中没有确切的顺序。

Lua中的表是一组键值对。表定义只是一次设置多个对的简写。定义对的顺序仅在存在重复键时才有意义:具有相同键的最后一对是保留在表中的那一对。

答案 3 :(得分:0)

我能够使用此代码解决这个问题,但当然这个解决方案并不完美。

local letters       =   {"DIN1=hi", "DIN2 = my", "AIN1 = name", "LE = is" }
local pattern       = "(%S+)%s*=%s*(%S+)"

for _, n in pairs(letters) do

    key, value = n:match(pattern)

    print(key, value)
end

输出:

DIN1    hi
DIN2    my
AIN1    name
LE      is