Krsort: примеры (PHP)

Сортировка массивов по ключам с помощью 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] => банан
)
Сортировка строковых ключей с флагом SORT_STRING
<?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
<?php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$array = ['я' => 1, 'а' => 2, 'ё' => 3];
krsort($array, SORT_LOCALE_STRING);
print_r($array);
?>
Сортировка по правилам локали, порядок может отличаться от стандартного.
Использование с ArrayObject
Пример php
<?php
$array = new ArrayObject(['c' => 3, 'a' => 1, 'b' => 2]);
$array->krsort();
print_r($array);
?>
ArrayObject Object
(
    [c] => 3
    [b] => 2
    [a] => 1
)
Сохранение порядка при одинаковых ключах
Пример php
<?php
$array = [2 => 'b', 1 => 'a', '2' => 'c'];
krsort($array, SORT_STRING);
print_r($array);
?>
Ключи '2' (строка) и 2 (число) считаются одинаковыми, одно из значений может быть потеряно.
Комбинирование флагов
Пример php
<?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 по убыванию.

PHP krsort function comments

En
Krsort Sort an array by key in descending order