Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lua Sort Table by Two Values?

So I have the following table:

servers = {"ProtectedMethod" = {name = "ProtectedMethod", visits = 20, players = 2}, "InjecTive" = {name = "InjecTive", visits = 33, players = 1}};

How would I sort the sub-tables in the servers table, into a new array based on players first, and then number of visits, meaning that you don't sort by visits unless two tables have the same value for players.

For example if the sorting code was put into a function called tableSort, I should be able to call the following code:

sorted = sort();
print(sorted[1].name .. ": " sorted[1].players .. ", " .. sorted[1].visits); --Should print "ProtectedMethod: 2, 20"
print(sorted[2].name .. ": " sorted[2].players .. ", " .. sorted[2].visits); --Should print "InjecTive: 1, 33"

TIA

like image 888
ProtectedMethod Avatar asked Oct 16 '25 03:10

ProtectedMethod


1 Answers

You have a hash, so you need to convert it to an array and then sort:

function mysort(s)
    -- convert hash to array
    local t = {}
    for k, v in pairs(s) do
        table.insert(t, v)
    end

    -- sort
    table.sort(t, function(a, b)
        if a.players ~= b.players then
            return a.players > b.players
        end

        return a.visits > b.visits
    end)
    return t
end

servers = {
    ProtectedMethod = {
        name = "ProtectedMethod", visits = 20, players = 2
    },

    InjecTive = {
        name = "InjecTive", visits = 33, players = 1
    }
}

local sorted = mysort(servers)
print(sorted[1].name .. ": " .. sorted[1].players .. ", " .. sorted[1].visits)
print(sorted[2].name .. ": " .. sorted[2].players .. ", " .. sorted[2].visits)
like image 122
Kknd Avatar answered Oct 19 '25 00:10

Kknd