Как сразу отсортировать таблицу html по столбцу, создавая ее из массива?

Помогите, пожалуйста! необходимо создать таблицу из массива, в котором находятся результаты гонок. и по итоговому столбцу, где общая сумма, разместить пилотов по местам, то есть отсортировать таблицу по последнему столбцу. нужно, чтоб сразу таблица выводилась отсортированная. можно использовать JS и/или PHP.

Я смог создать таблицу, но участники там расположены просто по порядку, как в массиве.

Вот пример:

$results = array(
        array(
            'id'=>1,
            'name'=>'Тюриков Т.',
            'city'=>'Нижний Новгород',
            'car'=>'Audi R8',
            'attempts'=>array(
                 '1'=>0,
                 '2'=>0,
                 '3'=>0,
                 '4'=>48
            ),
        ),
        array(
            'id'=>2,
            'name'=>'Волик А.',
            'city'=>'Санкт-Петербург',
            'car'=>'Subaru Impreza',
            'attempts'=>array(
                 '1'=>0,
                 '2'=>0,
                 '3'=>0,
                 '4'=>0
            ),
        ),
        array(
            'id'=>3,
            'name'=>'Арутюнян А.',
            'city'=>'Армавир',
            'car'=>'Audi RS7 Seven Force Stage 3',
            'attempts'=>array(
                 '1'=>49,
                 '2'=>12,
                 '3'=>0,
                 '4'=>62
            ),
        ),
    );

Ответы (2 шт):

Автор решения: Oliver Patterson

Думаю как-то так, если я правильно понял (это JS).

let results = 
[
    {
        "id": 1,
        "name": "Тюриков Т.",
        "city": "Нижний Новгород",
        "car": "Audi R8",
        "attempts": {
            "1": 0,
            "2": 0,
            "3": 0,
            "4": 48
        }
    },
    {
        "id": 2,
        "name": "Волик А.",
        "city": "Санкт-Петербург",
        "car": "Subaru Impreza",
        "attempts": {
            "1": 0,
            "2": 0,
            "3": 0,
            "4": 0
        }
    },
    {
        "id": 3,
        "name": "Арутюнян А.",
        "city": "Армавир",
        "car": "Audi RS7 Seven Force Stage 3",
        "attempts": {
            "1": 49,
            "2": 12,
            "3": 0,
            "4": 62
        }
    }
];

let sorted = results.sort( (a, b) => arrSum(Object.values(b.attempts)) - arrSum(Object.values(a.attempts)) );
console.log(sorted);

function arrSum(arr)
{
    return arr.reduce((total, value) => total + value, 0);
}

→ Ссылка
Автор решения: vsemozhebuty

Решение, похожее на уже данный ответ на JS, но при большом массиве будет работать чуть быстрее: мы один раз обойдём массив, создавая дополнительное поле с суммой результатов, чтобы потом при сортировке каждый раз не пересчитывать это заново. Поле можно игнорировать потом при создании таблицы. Сортировка происходит от большей суммы к меньшей.

const results = [
        {
            'id': 1,
            'name': 'Тюриков Т.',
            'city': 'Нижний Новгород',
            'car': 'Audi R8',
            'attempts': {
                 '1': 0,
                 '2': 0,
                 '3': 0,
                 '4': 48
            },
        },
        {
            'id': 2,
            'name': 'Волик А.',
            'city': 'Санкт-Петербург',
            'car': 'Subaru Impreza',
            'attempts': {
                 '1': 0,
                 '2': 0,
                 '3': 0,
                 '4': 0
            },
        },
        {
            'id': 3,
            'name': 'Арутюнян А.',
            'city': 'Армавир',
            'car': 'Audi RS7 Seven Force Stage 3',
            'attempts': {
                 '1': 49,
                 '2': 12,
                 '3': 0,
                 '4': 62
            },
        },
];

for (const person of results) {
  person.attemptsSum = Object.values(person.attempts)
                         .reduce((sum, num) => sum + num, 0);
}

results.sort((a, b) => b.attemptsSum - a.attemptsSum);

console.log(results);

→ Ссылка