array_multisort
пригодится, просто используйте упорядоченный диапазон в качестве второго массива ($order
просто временный, он служит для упорядочения эквивалентных элементов первого массива в его первоначальном порядке):
$a = [
"key-0" => 5,
"key-99" => 3,
"key-2" => 3,
"key-3" => 7
];
$order = range(1,count($a));
array_multisort($a, SORT_ASC, $order, SORT_ASC);
var_dump($a);
выход
array(4) {
["key-99"]=>
int(3)
["key-2"]=>
int(3)
["key-0"]=>
int(5)
["key-3"]=>
int(7)
}
Я использовал данные испытаний с неупорядоченными ключами, чтобы продемонстрировать, что они работают правильно. Тем не менее, вот вывод вашего тестового скрипта:
Array
(
[key-1] => 10
[key-4] => 10
[key-5] => 20
[key-8] => 20
[key-6] => 30
[key-9] => 30
[key-2] => 40
[key-0] => 50
[key-3] => 50
[key-7] => 50
)
Даунсайд
Работает только с предопределенными сравнениями, вы не можете использовать свою собственную функцию сравнения. Возможные значения (второй параметр array_multisort()
):
Флаги сортировки :
SORT_ASC
- сортировать элементы по возрастанию.
SORT_DESC
- сортировка элементов по убыванию.
SORT_REGULAR
- сравнивать элементы как обычно (не меняйте типы)
SORT_NUMERIC
- сравнить позиции численно
SORT_STRING
- сравнить элементы в виде строк
SORT_LOCALE_STRING
- сравнивать элементы в виде строк на основе текущей локали. Он использует локаль, которая может быть изменена с помощью
setlocale()
SORT_NATURAL
- сравнивать элементы в виде строк, используя «естественный порядок», например natsort()
SORT_FLAG_CASE
- можно комбинировать (побитовое ИЛИ) с SORT_STRING
или SORT_NATURAL
для сортировки строк без учета регистра