Krsort: примеры (PHP)
krsort(array &$array, int $flags = SORT_REGULAR): boolФункция krsort в PHP
Функция krsort() сортирует ассоциативный массив по ключам в порядке убывания (обратном алфавитно-цифровом). При этом связь между ключами и значениями сохраняется. Основное применение – упорядочивание данных в массиве для обратного вывода по ключу, например, при отображении записей от новых к старым, если ключами являются даты или идентификаторы.
Функция принимает два аргумента:
- array &$array – массив, передаваемый по ссылке. После выполнения функции исходный массив будет отсортирован.
- int $flags = SORT_REGULAR – необязательный параметр, определяющий поведение сравнения элементов. Доступные флаги:
SORT_REGULAR– обычное сравнение (без преобразования типов).SORT_NUMERIC– числовое сравнение.SORT_STRING– строковое сравнение.SORT_LOCALE_STRING– сравнение как строк с учетом локали.SORT_NATURAL– «естественное» сравнение как строк.SORT_FLAG_CASE– комбинируется сSORT_STRINGилиSORT_NATURALдля регистронезависимого сравнения.
Примеры использования krsort
<?php
$array = [3 => 'яблоко', 1 => 'банан', 2 => 'вишня'];
krsort($array);
print_r($array);
?>Array
(
[3] => яблоко
[2] => вишня
[1] => банан
)<?php
$array = ['z' => 'зебра', 'a' => 'антилопа', 'm' => 'медведь'];
krsort($array, SORT_STRING);
print_r($array);
?>Array
(
[z] => зебра
[m] => медведь
[a] => антилопа
)<?php
$array = ['img10.png' => 'a', 'IMG2.png' => 'b', 'img1.png' => 'c'];
krsort($array, SORT_NATURAL | SORT_FLAG_CASE);
print_r($array);
?>Array
(
[img10.png] => a
[IMG2.png] => b
[img1.png] => c
)Альтернативные функции сортировки в PHP
- ksort() – сортирует массив по ключам в порядке возрастания. Прямой аналог krsort с обратным порядком.
- arsort() – сортирует массив по значениям в порядке убывания с сохранением ключей.
- asort() – сортирует массив по значениям в порядке возрастания с сохранением ключей.
- uksort() – сортирует массив по ключам с использованием пользовательской функции сравнения. Позволяет реализовать сложную логику сортировки, не поддерживаемую стандартными флагами.
Выбор функции зависит от задачи: для сортировки по ключам в обратном порядке используют krsort, для сложных критериев – uksort.
Типичные ошибки
<?php
$var = 'строка';
krsort($var);
?>В PHP 8: TypeError: krsort(): Argument #1 ($array) must be of type array, string given.
<?php
$array = ['10' => 'десять', 2 => 'два', '01' => 'ноль один'];
krsort($array);
print_r($array);
?>Результат может быть непредсказуемым из-за неявного преобразования типов. Лучше явно указать SORT_STRING или SORT_NUMERIC.
<?php
$array = ['a' => ['x' => 1], 'b' => ['y' => 2]];
krsort($array);
print_r($array);
?>Сортирует только ключи верхнего уровня, внутренняя структура не затрагивается.
Изменения в последних версиях PHP
В PHP 8.0 функция krsort теперь выбрасывает исключение TypeError, если первый аргумент не является массивом. Ранее выдавалась ошибка уровня E_WARNING и функция возвращала false. Также в PHP 8 улучшена согласованность алгоритмов сортировки для больших массивов.
Расширенные примеры
<?php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$array = ['я' => 1, 'а' => 2, 'ё' => 3];
krsort($array, SORT_LOCALE_STRING);
print_r($array);
?>Сортировка по правилам локали, порядок может отличаться от стандартного.
<?php
$array = new ArrayObject(['c' => 3, 'a' => 1, 'b' => 2]);
$array->krsort();
print_r($array);
?>ArrayObject Object
(
[c] => 3
[b] => 2
[a] => 1
)<?php
$array = [2 => 'b', 1 => 'a', '2' => 'c'];
krsort($array, SORT_STRING);
print_r($array);
?>Ключи '2' (строка) и 2 (число) считаются одинаковыми, одно из значений может быть потеряно.
<?php
$array = ['Img10' => 1, 'img2' => 2, 'IMG1' => 3];
krsort($array, SORT_NATURAL | SORT_FLAG_CASE);
print_r($array);
?>Array
(
[Img10] => 1
[img2] => 2
[IMG1] => 3
)Аналоги в других языках программирования
Krsort в Python
В Python словари с версии 3.7 сохраняют порядок. Для сортировки по ключам в обратном порядке создают новый словарь через sorted().
dictionary = {3: 'яблоко', 1: 'банан', 2: 'вишня'}
sorted_dict = dict(sorted(dictionary.items(), reverse=True))
print(sorted_dict){3: 'яблоко', 2: 'вишня', 1: 'банан'}Krsort в Javascript
В JavaScript объекты не гарантируют порядок ключей, но можно отсортировать ключи и создать новый объект.
const obj = {3: 'яблоко', 1: 'банан', 2: 'вишня'};
const sorted = Object.keys(obj).sort((a, b) => b - a).reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
console.log(sorted);{ '3': 'яблоко', '2': 'вишня', '1': 'банан' }Krsort в MySQL
В MySQL при выборке данных можно использовать ORDER BY для сортировки, но для структур, аналогичных массивам, прямой замены нет.
SELECT * FROM fruits ORDER BY id DESC;Возвращает записи с сортировкой по id по убыванию.