如果我尝试输出这个表,它们会以错误的顺序循环:
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和值打印
答案 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级,k
和v
取nil
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