Jump to content

Contar los índices que hay en una tabla


aka Blue

Recommended Posts

Posted

Bueno, principalmente lo que quiero hacer es comprobar la de tablas que hay en una tabla (si, suena muy tonto pero abajo dejaré un código más o menos explicativo de lo que quiero llegar a saber). Básicamente para colocar un límite (es decir, si una tabla que quiero guardar toJSON tiene 3 índices, quiero poner que haya máximo 6, que serían dos valores).

Podríamos decir que son algo como slots limitados pero con datos.

local miTabla = { } 
  
addCommandHandler ( "llenarPrimerContenido", 
    function ( player, commandName ) 
        local tabla = miTabla [ player ] 
        if tabla then 
            miTabla [ player ] = { valor1 = 0, valor2 = 0, valor3 = 0 } 
        end 
    end 
)   
  
addCommandHandler ( "llenarSegundoContenido", 
    function ( player, commandName ) 
        local tabla = miTabla [ player ] 
        if tabla then 
            if tabla.valor1 == 0 and tabla.valor2 == 0 and tabla.valor3 == 0 then 
                miTabla [ player ] = { valor1 = 0, valor2 = 0, valor3 = 0, { valor1 = 1, valor2 = 1, valor3 = 1 } } 
            end 
        end 
    end 
) 

Gracias.

Posted

Si la tabla está ordenada numéricamente (sin saltos), puedes utilizar:

  
#table 
  

Si no, haz un for-loop junto a una variable aditiva.

Posted

Lo que quiero utilizar es table.insert para insertar más valores en formato

{ dato1 = 0, dato2 = 0, dato3 = 0 } 

Tal como tengo en un sistema actualmente integrado en el servidor. Pero hacer que ese table.insert tenga un límite y que al tener unas tres o dos tabla como la anteriormente mencionada en la base:

{ dato1 = 0, dato2 = 0, dato3 = 0 } 

Pues que ya no deje insertar más.

Espero haberme explicado correctamente y gracias por comentar, Tomas :)

Posted

Gracias Asus, ¿podrías aclararme un poco cómo podría hacer para que funcione como yo quiera?

Gracias nuevamente :)

PD: Y a los rusos también que son unos máquinas jaja.

Posted
  
function table.size( t ) 
    if type( t ) ~= 'table' then 
        return false 
    end 
    local n = 0 
    for _ in pairs( t ) do 
        n = n + 1 
    end 
    return n 
end 
  

Creditos al sub-foro russo: https://forum.multitheftauto.com/viewtopic.php?f=141&t=33091

Pero eso sería lo mismo que hacer #table.

Si estas tan seguro de ello, haz un test por ti mismo :)

No se puede usar table.insert para hacer data1 data2 así que no entiendo lo que necesitas exactamente.

Posted
  
function table.size( t ) 
    if type( t ) ~= 'table' then 
        return false 
    end 
    local n = 0 
    for _ in pairs( t ) do 
        n = n + 1 
    end 
    return n 
end 
  

Creditos al sub-foro russo: https://forum.multitheftauto.com/viewtopic.php?f=141&t=33091

Pero eso sería lo mismo que hacer #table.

Si estas tan seguro de ello, haz un test por ti mismo .

._.

tt = {{"a"},{"b"},{"c"},{"d"},{"e"},{"f"}} 
  
function table.size( t ) 
    if type( t ) ~= 'table' then 
        return false 
    end 
    local n = 0 
    for _ in pairs( t ) do 
        n = n + 1 
    end 
    return n 
end 
  
outputChatBox("metodo 1: "..table.size( tt ), 255, 255, 0) 
outputChatBox("metodo 2: "..#tt, 255, 0, 0) 

es que a simple vista se ve como se va contando 'n' estando dentro del ciclo y retornas al valor final de n. así que no entiendo :D

Posted
Lo que quiero utilizar es table.insert para insertar más valores en formato
{ dato1 = 0, dato2 = 0, dato3 = 0 } 

Tal como tengo en un sistema actualmente integrado en el servidor. Pero hacer que ese table.insert tenga un límite y que al tener unas tres o dos tabla como la anteriormente mencionada en la base:

{ dato1 = 0, dato2 = 0, dato3 = 0 } 

Pues que ya no deje insertar más.

Espero haberme explicado correctamente y gracias por comentar, Tomas :)

Quieres hacer que al insertar un dato en la tabla, chequee si ya hay un dato con el mismo valor?

Posted

._.

tt = {{"a"},{"b"},{"c"},{"d"},{"e"},{"f"}} 
  
function table.size( t ) 
    if type( t ) ~= 'table' then 
        return false 
    end 
    local n = 0 
    for _ in pairs( t ) do 
        n = n + 1 
    end 
    return n 
end 
  
outputChatBox("metodo 1: "..table.size( tt ), 255, 255, 0) 
outputChatBox("metodo 2: "..#tt, 255, 0, 0) 

es que a simple vista se ve como se va contando 'n' estando dentro del ciclo y retornas al valor final de n. así que no entiendo

pruebalo con esta array:

local tt = {"hello", text = hello, "bb", text2 = bb} 

Posted
pruebalo con esta array:
local tt = {"hello", text = hello, "bb", text2 = bb} 

No entiendo, sigue dándome la misma cantidad.

Ups sorry se hice mal la array:

local tt = {"hello", text = "hello", "bb", text2 = "bb"} 

Posted

Revivo éste tema para preguntar una duda. Esto no es muy normal pero... ¿se puede hacer un índex dentro de un índex? Básicamente lo que quiero hacer es un cinturón con slots mediante tablas. Con éste código creo que lo dejo claro:

local cinturon = { } 
  
addCommandHandler ( "guardar", 
    function ( player, commandName, slot ) 
        local slot = tonumber ( slot ) 
        if slot <= 3 then 
            if cinturon [ player ] == nil then 
                local arma = getPedWeapon ( player ) 
                if arma then 
                    local ammo = getPedTotalAmmo ( player ) 
                    table.insert ( cinturon, [slot] = { arma = arma, municion = municion } ) 
                else 
                    outputChatBox ( "Debes tener un arma en la mano para poder guardarla.", player, 255, 0, 0 ) 
                end 
            else 
                if cinturon [ player ][ slot ] then 
                    local arma = cinturon [ player ][ slot ].arma 
                    local municion = cinturon [ player ][ slot ].municion 
                     
                    outputChatBox ( "En ese slot llevas el arma "..arma.." con "..municion.." de municion.", player, 255, 255, 0 ) 
                end 
            end 
        else 
            outputChatBox ( "El cinturón sólo tiene 3 slots. Usa /"..commandName.." [slot (1,2 o 3)]", player, 255, 255, 255 ) 
        end 
    end 
) 

Posted

En vez de table.insert, simplemente haces:

cinturon[player] = {} 
cinturon[player][slot] = {arma = arma, municion = municion} 

Posted

Tengo un problema. Al guardar un arma por ejemplo en el Slot 2, se guarda, pero después al meter otra en el slot 1, se guarda solo la del slot 1 y la del slot 2 se remueve.

addCommandHandler ( "guardar", 
    function ( player, commandName, slot ) 
        local slot = tonumber ( slot ) 
        if slot then 
            if cinturon [ player ] == nil or cinturon [ player ][ slot ] == nil then 
                local arma = getPedWeapon ( player ) 
                if arma and arma > 0 then 
                    local ammo = getPedTotalAmmo ( player ) 
                    cinturon [ player ] = { } 
                    cinturon [ player ][ slot ] = { arma = arma, ammo = ammo } 
                    takeWeapon ( player, arma ) 
                    exports.chat:me ( player, "guarda un "..getWeaponNameFromID ( arma ).." en su cinturón." ) 
                else 
                    outputChatBox ( "Debes tener un arma en la mano para poder guardarla.", player, 255, 0, 0 ) 
                end 
            elseif cinturon [ player ][ slot ] then 
                local arma = cinturon [ player ][ slot ].arma 
                local municion = cinturon [ player ][ slot ].ammo 
                     
                outputChatBox ( "En ese slot llevas el arma "..getWeaponNameFromID ( arma ) .." con "..municion.." de municion.", player, 255, 255, 0 ) 
            end 
        else 
            outputChatBox ( "El cinturón sólo tiene 3 slots. Usa /"..commandName.." [slot (1,2 o 3)]", player, 255, 255, 255 ) 
        end 
    end 
) 

Posted
cinturon = { } 
  
addCommandHandler ( "guardar", 
    function ( player, commandName, slot ) 
        local slot = tonumber ( slot ) 
        if slot then 
            local arma = getPedWeapon ( player ) 
            if arma == 0 then 
                outputChatBox ( "Debes tener un arma en la mano para poder guardarla.", player, 255, 0, 0 ) 
                return 
            end 
             
            if not cinturon [ player ] then 
                cinturon[player] = {} 
            end      
                     
            if not cinturon [ player ][slot] then 
                local ammo = getPedTotalAmmo ( player ) 
                cinturon [ player ][ slot ] = { arma = arma, ammo = ammo } 
                takeWeapon ( player, arma ) 
                exports.chat:me(player, "guarda un "..getWeaponNameFromID ( arma ).." en su cinturón.")     
            else 
                local arma = cinturon [ player ][ slot ].arma 
                local municion = cinturon [ player ][ slot ].ammo 
                    
                outputChatBox ( "En ese slot llevas el arma "..getWeaponNameFromID ( arma ) .." con "..municion.." de municion.", player, 255, 255, 0 ) 
                return 
            end 
        else 
            outputChatBox ( "El cinturón sólo tiene 3 slots. Usa /"..commandName.." [slot (1,2 o 3)]", player, 255, 255, 255 ) 
            return 
        end 
    end 
) 

Te lo organicé un poco mejor y funciona perfectamente ahora.

cinturon [ player ] = { } 
cinturon [ player ][ slot ] = { arma = arma, ammo = ammo } 

El problema era que estabas suscribiendo la tabla.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...