nepster-web
@nepster-web

Как обработать массив и посчитать необходимые данные ?

Ломаю голову над такой задачкой.

Есть массив такого вида:
array(
    array('earn'=>'12'),
    array('earn'=>'15'),
    array('earn'=>'10',),
   array('earn'=>'9'),
);


earn это достижения пользователя в игре, к примеру, это игровые очки. В данном случае есть 4 пользователя (хотя может быть сколько угодно, от 2 и более), которые закончили игру. Нужно определить победителей и дописать еще 2 ключа.
winner = -1, 1 или 0. Пользователь сыграл вничью, победил или проиграл
award = от 1 до 100. Вознаграждение пользователя в %

Из такого массива
array(
    array('earn'=>'12'),
    array('earn'=>'15'),
    array('earn'=>'10',),
   array('earn'=>'9'),
);


Нужно получить вот такой
array(
    array('earn'=>'15', 'winner '=> 1, award => 100),
    array('earn'=>'12', 'winner '=> 0, award => 0),
    array('earn'=>'10', 'winner '=> 0, award => 0),
   array('earn'=>'9, 'winner '=> 0', award => 0),
);


Теперь в чем возникает трудность:

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

Примеры:
Пример 1, Явный победитель:
 array(
    array('earn'=>'12'),
    array('earn'=>'15'),
    array('earn'=>'10',),
   array('earn'=>'9'),
);
Результат:
 array(
    array('earn'=>'15', 'winner '=> 1, award => 100),
    array('earn'=>'12', 'winner '=> 0, award => 0),
    array('earn'=>'10', 'winner '=> 0, award => 0),
   array('earn'=>'9, 'winner '=> 0', award => 0),
);

----------------------

Пример 2, Спорная победа:
 array(
    array('earn'=>'15'),
    array('earn'=>'15'),
    array('earn'=>'10',),
   array('earn'=>'9'),
);
Результат:
 array(
    array('earn'=>'15', 'winner '=> -1, award => 50),
    array('earn'=>'15, 'winner '=> -1, award => 50),
    array('earn'=>'10', 'winner '=> 0, award => 0),
   array('earn'=>'9, 'winner '=> 0', award => 0),
);

----------------------

Пример 3, Спорная победа 2:
 array(
    array('earn'=>'15'),
    array('earn'=>'15'),
    array('earn'=>'15',),
   array('earn'=>'9'),
);
Результат:
 array(
    array('earn'=>'15', 'winner '=> -1, award => 33.33),
    array('earn'=>'15, 'winner '=> -1, award => 33.33),
    array('earn'=>'15', 'winner '=> -1, award => 33.33),
   array('earn'=>'9, 'winner '=> 0', award => 0),
);

----------------------

Пример 4, Общая ничья:
 array(
    array('earn'=>'15'),
    array('earn'=>'15'),
    array('earn'=>'15',),
   array('earn'=>'15'),
);
Результат:
 array(
    array('earn'=>'15', 'winner '=> -1, award => 25),
    array('earn'=>'15, 'winner '=> -1, award => 25),
    array('earn'=>'15', 'winner '=> -1, award => 25),
   array('earn'=>'15,  'winner '=> -1', award => 25),
);


В общем, уже весь мозг сломал этой задачкой, никак не получается красиво обходить массив и сформировать нужные данные. Подскажите, пожалуйста, как можно это просто организовать?
  • Вопрос задан
  • 2460 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А в чём проблема?
$totalAward = 100;
$maxEarn = -1;
$numWinners = 0;
foreach($gamers as $gamer) {
    if ($gamer['earn'] == $maxEarn)
        $numWinners++;
    elseif ($gamer['earn'] > $maxEarn) {
        $maxEarn = $gamer['earn'];
        $numWinners = 1;
    }
}
$result = array();
foreach($gamers as $gamer) {
    if ($gamer['earn'] == $maxEarn) {
        $gamer['winner'] = -1;
        $gamer['award'] = $totalAward/$numWinners;
    } else {
        $gamer['winner'] = 0;
        $gamer['award'] = 0;
    }
    $result[] = $gamer;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы