Я знаю, что есть некоторые другие темы по сортировке с несколькими критериями, но они не устраняют мою проблему. Предположим, у меня есть этот массив:
Array ( [0] => Array ( [uid] => 1 [score] => 9 [endgame] => 2 ) [1] => Array ( [uid] => 2 [score] => 4 [endgame] => 1 ) [2] => Array ( [uid] => 3 [score] => 4 [endgame] => 100 ) [3] => Array ( [uid] => 4 [score] => 4 [endgame] => 70 ) )
Я хочу сортировать его, поставив его с ВЫСОКОЙ оценкой сверху. На том же счете я хочу тот, у которого самый низкий номер эндшпиля сверху. Механизм сортировки должен оценивать user1 сверху, затем user2, затем 4, а затем user3.
Я использую этот механизм сортировки:
function order_by_score_endgame($a, $b) { if ($a['score'] == $b['score']) { // score is the same, sort by endgame if ($a['endgame'] == $b['endgame']) return 0; return $a['endgame'] == 'y' ? -1 : 1; } // sort the higher score first: return $a['score'] < $b['score'] ? 1 : -1; } usort($dummy, "order_by_score_endgame");
Это дает мне следующий массив:
Array ( [0] => Array ( [uid] => 1 [score] => 9 [endgame] => 2 ) [1] => Array ( [uid] => 3 [score] => 4 [endgame] => 100 ) [2] => Array ( [uid] => 2 [score] => 4 [endgame] => 1 ) [3] => Array ( [uid] => 4 [score] => 4 [endgame] => 70 ) )
Как вы можете видеть, массив не отсортирован правильно … Кто-нибудь знает, что я делаю неправильно? Большое спасибо!
Ваша функция должна быть такой:
function order_by_score_endgame($a, $b){ if ($a['score'] == $b['score']) { // score is the same, sort by endgame if ($a['endgame'] > $b['endgame']) return 1; } // sort the higher score first: return $a['score'] < $b['score'] ? 1 : -1; }
Попробуйте. Это даст вам результат следующим образом:
Array ( [0] => Array ( [uid] => 1 [score] => 9 [endgame] => 2 ) [1] => Array ( [uid] => 2 [score] => 4 [endgame] => 1 ) [2] => Array ( [uid] => 4 [score] => 4 [endgame] => 70 ) [3] => Array ( [uid] => 3 [score] => 4 [endgame] => 100 ) )