Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Как выбрать победителя (победителей) из 3 участников?

#php #алгоритм


Уточняю, вот пример массива массивов игроков. Тем, кто набрал больше очков, нужно
добавить +1 в [won_tours]. В данном примере это Array[0] и Array[2].

Пробовал asort() и arsort(), но это не то, что нужно.
Пробовал с if - работает, но много ифов.

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

Array
(
    [0] => Array
        (
            [name] => Bobby
            [last_tour_points] => 20
            [won_tours] => 0
        )

    [1] => Array
        (
            [name] => Chuck
            [last_tour_points] => 10
            [won_tours] => 0
        )

    [2] => Array
        (
            [name] => Wendy
            [last_tour_points] => 20
            [won_tours] => 0
        )
)


В общем, я разобрался и цель достигнута:


Отсортировал с помощью uasort
Вытянул первый элемент с помощью array_shift для образца
Перебрал игроков циклом, сравнивая 'last_tour_points' с образцом
При совпадении добавлял +1 в 'won_tours'


Спасибо всем, кто помог направить мысли в нужное направление.
    


Ответы

Ответ 1



Вы не показываете ваш код, поэтому попробуйте понять объяснение на пальцах. If вообще не нужен: он и для массива из трёх участников неудобочитаемый, а если у вас N участников то трудностей ещё больше. Метод расчёта победителей возвращает массив победителей, метод награждения в цикле проходит по массиву, добавляя победителям награждение. Просто проходите по отсортированному по убыванию массиву награждая всех до тех пор пока у очередного победителя число баллов совпадает с числом баллов самого лучшего участника (нулевой элемент массива, можете запомнить в отдельную переменную), как только отличается -- выходите из цикла.

Ответ 2



Пожалуй, проще всего первым проходом по массиву найти максимальное количество баллов (был бы знакомый язык - набросал бы код, там все просто), второй проход - тем, у кого это количество баллов, добавлять по очку. Примерно на псевдокоде: max = a[1] for i = 2 to N do if max < a[i] then max = a[i] for i = 1 to N do if max = a[i] then a[i] = a[i] + 1 Главное - никакая сортировка массива при этом не нужна в принципе :)

Ответ 3



По просьбе Suvitruf says Reinstate Monica публикую свое окончательное решение в виде ответа. Если что судите строго, учу PHP только пару недель, любая критика интересна. ####################################################### # найти победителей тура и добавить им +1 в won_tours # ####################################################### # делаю копию массива, чтобы не было побочного эффекта для основоного массива $whoo_win_tour = $players; # отсортировать массив по значениям по возрастанию uasort($whoo_win_tour, function($a, $b) { return $b['last_tour_points'] - $a['last_tour_points']; }); # так как после uasort индексы не упорядочены - извлекаю первый элемент с array_shift $whoo_win_tour = array_shift($whoo_win_tour); # максимум очков за тур $max_point_of_tour = $whoo_win_tour['last_tour_points']; # в основном массиве победителям добавляем +1 в won_tours for ($j = 0; $j < count($players); $j++) { if($players[$j]['last_tour_points'] == $max_point_of_tour) { $players[$j]['won_tours'] += 1; echo "{$players[$j]['name']} победил!!!

"; } # обнуляем last_tour_points для следующего тура $players[$j]['last_tour_points'] = 0; }

Ответ 4



Нужно ввести ещё 1 параметр сравнения. Или общее время выполнения или время получения двадцатого очка.

Комментариев нет:

Отправить комментарий