Я решил использовать решение @ vivek_23 (отредактировано | исправлено).
Я отредактировал ненужное else
и изменил возвращаемое значение на ноль, если fe оба смещения не установлены.
Если a и b пропускают смещение или не имеют приоритета, функция должна возвращать ноль imo.
Рабочий код:
uasort($array, function ($a, $b) use ($offset, $priorities) {
if (!isset($a[$offset])) {
return !isset($b[$offset])
? 0
: 1; // down
} elseif (!isset($b[$offset])) {
return -1; // up
}
if (isset($priorities[$a[$offset]])) {
if (!isset($priorities[$b[$offset]])) {
return -1; // up
}
return $priorities[$a[$offset]] > $priorities[$b[$offset]]
? -1 // up
: 1; // down
}
return isset($priorities[$b[$offset]])
? 1 // down
: 0;
});
Это позволяет мне использовать отрицательный приоритет,приоритет с плавающей запятой, и я не переопределяю приоритеты (см. -99999999 @ Решение для Эдди).
Протестировано
// expect A, A, B, B, C, C, ... "no type ..." at bottom
$priorities = [
'A' => 8,
'B' => 7,
'C' => 6,
'D' => 5,
'E' => 4,
'F' => 3,
'G' => 2,
'H' => 1,
];
// expect "no type ..." at bottom, ..., C, C, B, B, A, A
$priorities = [
'A' => -8,
'B' => -7,
'C' => -6,
'D' => -5,
'E' => -4,
'F' => -3,
'G' => -2,
'H' => -1,
];
// expect B, B, A, A, C, C, ... "no type ..." at bottom
$priorities = [
'A' => 6.5,
'B' => 7,
'C' => 6,
'D' => 5,
'E' => 4,
'F' => 3,
'G' => 2,
'H' => 1,
];
// expect "no type ..." at bottom, ..., C, C, A, A, B, B
$priorities = [
'A' => -6.5,
'B' => -7,
'C' => -6,
'D' => -5,
'E' => -4,
'F' => -3,
'G' => -2,
'H' => -1,
];
Спасибо @ vivek_23:)