先来看看下列案列:
local a1 = { 1, 2, 3 }
local a2 = { [1]=1, [3]=2, [5]=3, [7]=4 }
local a3 = { [2]=3, [10]=2, [20]=2 }
local a4 = { 2, name='yuanbl', 3, age=25, 5, 9 }
local a5 = { name='yuanbl', age=25, sex='男'}
local a6 = { 2, name='yuanbl', 3, age=25, 5, 9, hello=nil, 10 }
计算(# 或 table.getn())结果如下:
3
1
2
4
0
5
它是怎么做到的?
分析: table.getn(t) 和 #t 一样都是计算数组元素但不包括hash键值,并且数组元素一定是从1开始的,顺序递增且不包含元素nil。只有这种情况才能正确的计算个数,可知a1正确;再来分析a2,查找1成立,接着查找2,没有找到,结束查找,返回结果为1;a3不满足条件产生呵呵的结果;a4、a5、a6同理可分析。
正确计算table元素个数
function isTable ( value )
if type( value ) ~= "table" then
value = {}
end
return value
end
function countNums ( t )
local count = 0
local t = isTable ( t )
for k, v in pairs( t ) do
count = count + 1
end
return count
end
ngx.say( isTable( a1 ) ) -- 3
ngx.say( isTable( a2 ) ) -- 4
ngx.say( isTable( a3 ) ) -- 3
ngx.say( isTable( a4 ) ) -- 6
ngx.say( isTable( a5 ) ) -- 3
ngx.say( isTable( a6 ) ) -- 7