Правильная сортировка многомерного массива с использованием оператора usort и космического корабля

Мне нужно отсортировать следующий массив со следующей логикой: если «оценка» совпадает, я хочу сравнить с использованием «время». Массив выглядит следующим образом:

$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ],
34 => [ 'score' => 1, 'time' => 5.646 ],
66 => [ 'score' => 3, 'time' => 1.554 ]
]

«Ключи» в приведенном выше массиве — это «user_ids», которые мне нужно сохранить в отсортированном массиве. Моя лучшая попытка на данный момент — как показано ниже —

$result = usort( $user_scores, function ( $a, $b ) {
if ( $a['score'] == $b['score'] ) {
return $a['time'] == $b['time'];
}
return $a['score'] <=> $b['score'];
} );

Очевидно, это не работает, и я получаю массив $ user_scores с заменой всех ключей на 0, 1, 2 вместо user_ids (82, 34 и 66). Сортировка тоже не работает.

Для приведенного выше массива желаемым выводом будет массив $ user_scores:

$user_scores = [ 34 => [ 'score' => 1, 'time' => 5.646 ],
82 => [ 'score' => 1, 'time' => 6.442 ],
66 => [ 'score' => 3, 'time' => 1.554 ]
]

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

—ОБНОВИТЬ —

Необходимая логика сортировки выглядит следующим образом:

  1. Чем выше оценка, тем выше будет ранг.
  2. Чем выше время, тем ниже будет ранг.

Это в основном сортировка результатов викторины. Лучшие бомбардиры с наименьшим количеством времени будут на вершине; и те, у кого меньше очков и больше времени, будут внизу.

1

Решение

Чтобы сохранить ключи, вам просто нужно использовать uasort(),
Я добавил космический корабль к вашему возвращению time сравнение.
Я изменил порядок вашего возвращения score сравнение.
$result в вашем коде только собираюсь вернуть true/false так что это бесполезно для вас. sort()‘функции не должны быть присвоены переменной; они напрямую влияют на входной массив.

Метод:

$user_scores = [ 82 => [ 'score' => 1, 'time' => 6.442 ],
34 => [ 'score' => 1, 'time' => 5.646 ],
66 => [ 'score' => 3, 'time' => 1.554 ],
7 => [ 'score' => 2, 'time' => 4.442 ],
99 => [ 'score' => 4, 'time' => 3.646 ],
55 => [ 'score' => 1, 'time' => 2.554 ]
];

uasort($user_scores,function($a,$b){
if($a['score'] == $b['score']){
return $a['time'] <=> $b['time'];
}
return $b['score'] <=> $a['score'];
});
var_export($user_scores);

Выход:

array (
99 =>
array (
'score' => 4,
'time' => 3.646,
),
66 =>
array (
'score' => 3,
'time' => 1.554,
),
7 =>
array (
'score' => 2,
'time' => 4.442,
),
55 =>
array (
'score' => 1,
'time' => 2.554,
),
34 =>
array (
'score' => 1,
'time' => 5.646,
),
82 =>
array (
'score' => 1,
'time' => 6.442,
),
)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]