Сортировка массива с сотнями разных имен и значений - PullRequest
0 голосов
/ 11 августа 2011

Я создаю программу, которая отслеживает сотни пользователей, захватывает их опыт (сохраняет его), а затем снова захватывает его по требованию, когда назначенное время для отслеживания истекло. То, что я пытаюсь сделать, это отсортировать количество полученного опыта, сохранив его в связи с именем, и затем вывести полученный опыт от наивысшего к низшему.

Вот пример того, что я делаю:

display();

function display() {
    $participants = array("a", "b", "c", "d", "e");
    sort($participants);
    for ($i = 0; $i < count($participants); $i++) {
        $starting = getStarting($participants[$i]);
        $ending = getEnding($participants[$i]);
        $gained = $ending - $starting;
    }
}

function getStarting($name) {
    $a = "a";
    return $name == $a ? 304 : 4;
}

function getEnding($name) {
    $a = "a";
    return $name == $a ? 23 : 34;
}

Итак, я пытаюсь сделать так, чтобы, если бы я печатал переменную, сначала был бы «а» (потому что, как вы можете видеть, я сделал так, чтобы «а» был единственным «человеком»). который приобрел больше опыта, чем другие », тогда« быть »следовало бы в алфавитном порядке. В настоящее время он сортирует их в алфавитном порядке, прежде чем какие-либо данные собираются, поэтому я предполагаю, что все, что мне нужно сделать, это отсортировать полученный опыт.

Как мне этого добиться?

1 Ответ

0 голосов
/ 11 августа 2011

Самый простой способ - это поместить значения в многомерный массив, а затем использовать usort ():

function score_sort($a,$b) {
  // This function compares $a and $b
  // $a[0] is participant name
  // $a[1] is participant score
  if($a[1] == $b[1]) {
    return strcmp($a[0],$b[0]);  // Sort by name if scores are equal
  } else {
    return $a[1] < $b[1] ? -1 : 1;  // Sort by score
  }
}

function display() {
  $participants = array("a", "b", "c", "d", "e");

  // Create an empty array to store results
  $participant_scores = array();  

  for ($i = 0; $i < count($participants); $i++) {
    $starting = getStarting($participants[$i]);
    $ending = getEnding($participants[$i]);
    $gained = $ending - $starting;
    // Push the participant and score to the array 
    $participant_scores[] = array($participants[$i], $gained);
  }

  // Sort the array
  usort($participant_scores, 'score_sort');

  // Display the results
  foreach($participant_scores as $each_score) {
    sprintf("Participant %s has score %i\n", $each_score[0], $each_score[1]);
  }
}
...