2012-02-18 5 views
0

Я с этим вопросом, где я хочу sorty многомерный массив на основе 2-х параметровPHP array_multisort не работает

Я строю свой массив так:

$teamList[$t['id']] = array(
    'id'  => $t['id'], 
    'name' => $t['name'], 
    'score' => $score, 
    'points' => $array 
); 

Я тогда вроде как это:

foreach ($teamList as $key => $row) { 
     $score[$key] = $row['score']; 
     $points[$key] = $row['points'];  
} 
array_multisort($score, SORT_DESC, $points, SORT_DESC, $teamList); 

Но сборщик команд остается несортированным?

+0

можете ли вы использовать команду dump_var $ teamList и опубликовать ее? Мне любопытно, почему ваш случай не работает – dldnh

ответ

0

Вы можете легко использовать пользовательскую функцию сравнения, а не выполнять все операции копирования значений и злоупотреблять array_multisort().

function sortByScoreAndPoints($a, $b) { 
    if ($a['score'] == $b['score']) { 
    if ($a['points'] == $b['points']) { 
     return 0; 
    } 
    return ($a['points'] > $b['points']) ? -1 : 1; 
    } 
    return ($a['score'] > $b['score']) ? -1 : 1; 
} 

uasort($teamlist, 'sortByScoreAndPoints'); 

Функция сортировки должна принимать два параметра, которые могут иметь произвольные имена, но $ а и $ Ь используется в документации. Во время сортировки PHP передает любые два значения массива как $ a и $ b и ожидает ответа, в каком порядке они должны появляться. Функция сортировки должна возвращать -1, если сначала должен появиться $ a, 0, если они равны, или 1, если $ a должно появиться последним, по сравнению с $ b.

Мой код первых тестов, если баллы равны. Если нет, то последнее возвращение будет сравнивать, какой балл выше ($ a> $ b), а счет максимумов сначала входит в список (если a больше b, верните -1, чтобы сказать, что a идет первым).

Если баллы равны, очки будут проверены. Если они не равны, сравнение происходит снова. В противном случае возвращается 0.

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

Если вы хотите, чтобы отсортированный массив был перенумерован, начиная с 0, используйте usort() вместо uasort().

Смежные вопросы