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

Сортировка массивов по ключам с помощью ksort в PHP
Раздел: Работа с массивами
ksort(array &$array, int $flags = SORT_REGULAR): bool
Описание функции ksort

Функция ksort выполняет сортировку массива по ключам в порядке возрастания, сохраняя связи между ключами и значениями. Эта функция используется, когда требуется упорядочить ассоциативный массив по его ключам.

Функция принимает один обязательный аргумент – массив, передаваемый по ссылке, и один необязательный аргумент – флаг сортировки.

Аргументы функции
  • array (обязательный) – исходный массив, который будет отсортирован. Передается по ссылке, поэтому функция изменяет исходный массив.
  • flags (необязательный) – флаг, определяющий тип сравнения элементов. Доступные значения:
    SORT_REGULAR
    – обычное сравнение (по умолчанию);
    SORT_NUMERIC
    – числовое сравнение;
    SORT_STRING
    – строковое сравнение;
    SORT_LOCALE_STRING
    – строковое сравнение с учетом текущей локали;
    SORT_NATURAL
    – «естественная» сортировка строк;
    SORT_FLAG_CASE
    – комбинируется с SORT_STRING или SORT_NATURAL для регистронезависимой сортировки.
Короткие примеры использования
Стандартная сортировка

Сортировка ассоциативного массива по ключам в порядке возрастания.

$arr = ["d" => "лимон", "a" => "апельсин", "b" => "банан", "c" => "яблоко"];
ksort($arr);
print_r($arr);
Array
(
    [a] => апельсин
    [b] => банан
    [c] => яблоко
    [d] => лимон
)
Сортировка с флагом SORT_NUMERIC

Когда ключи представлены как строки, но являются числами.

$arr = ["10" => 10, "2" => 2, "1" => 1];
ksort($arr, SORT_NUMERIC);
print_r($arr);
Array
(
    [1] => 1
    [2] => 2
    [10] => 10
)
Сортировка с флагом SORT_NATURAL | SORT_FLAG_CASE

Естественная регистронезависимая сортировка строковых ключей.

$arr = ["img12.png" => 1, "IMG10.png" => 2, "img2.png" => 3, "img1.png" => 4];
ksort($arr, SORT_NATURAL | SORT_FLAG_CASE);
print_r($arr);
Array
(
    [img1.png] => 4
    [img2.png] => 3
    [IMG10.png] => 2
    [img12.png] => 1
)
Похожие функции в PHP

В PHP существует несколько функций для сортировки массивов по ключам.

Функция krsort выполняет сортировку массива по ключам в порядке убывания. Параметры аналогичны ksort.

asort и arsort

Функции asort и arsort сортируют массив по значениям, сохраняя связь с ключами, в порядке возрастания и убывания соответственно.

Функция uksort позволяет отсортировать массив по ключам, используя пользовательскую функцию сравнения. Используется для нестандартных алгоритмов сортировки.

Функцию ksort применяют для простой сортировки ассоциативных массивов по ключам. Если требуется обратный порядок, подходит krsort. Для сортировки по значениям с сохранением ключей используют asort/arsort. Пользовательскую логику сортировки ключей реализуют через uksort.

Типичные ошибки
Передача переменной, не являющейся массивом

Функция ожидает массив. Передача другого типа данных вызовет предупреждение и вернет false.

$var = "это строка";
$result = ksort($var);
var_dump($result);
Warning: ksort() expects parameter 1 to be array, string given
bool(false)
Игнорирование возвращаемого значения

Функция возвращает true в случае успеха и false в случае ошибки. Результат сортировки виден в измененном исходном массиве.

$arr = ["b" => 2, "a" => 1];
if (ksort($arr)) {
    echo "Сортировка успешна";
} else {
    echo "Ошибка сортировки";
}
Сортировка успешна
Ожидание создания нового массива

Функция модифицирует переданный массив, а не возвращает новый.

$original = ["z" => 1, "a" => 2];
$sorted = ksort($original); // $sorted содержит true/false, а не массив
print_r($original); // Оригинальный массив изменен
Array
(
    [a] => 2
    [z] => 1
)
Изменения в последних версиях PHP

Начиная с PHP 8.0.0, функция ksort теперь возвращает значение true в случае успеха. Ранее возвращалось значение true в случае успеха, однако в некоторых версиях могло возвращаться false при успешной сортировке некоторых типов массивов. Поведение было стандартизировано.

Других значительных изменений в поведении функции ksort в последних версиях PHP не было. Поддержка флагов сортировки остается стабильной.

Расширенные примеры
Сортировка многомерного массива по ключам

ksort сортирует только ключи первого уровня.

Пример php
$arr = [
    "user2" => ["age" => 30, "name" => "Борис"],
    "user1" => ["age" => 25, "name" => "Анна"],
    "user3" => ["age" => 35, "name" => "Виктор"]
];
ksort($arr);
print_r($arr);
Array
(
    [user1] => Array
        (
            [age] => 25
            [name] => Анна
        )
    [user2] => Array
        (
            [age] => 30
            [name] => Борис
        )
    [user3] => Array
        (
            [age] => 35
            [name] => Виктор
        )
)
Сортировка с комбинированными числовыми и строковыми ключами

По умолчанию числовые ключи обрабатываются как строки.

Пример php
$arr = [10 => "десять", "2" => "два", 1 => "один", "a" => "буква"];
ksort($arr, SORT_STRING);
print_r($arr);
Array
(
    [1] => один
    [10] => десять
    [2] => два
    [a] => буква
)
Использование с флагом SORT_LOCALE_STRING

Сортировка с учетом локали, например, для корректного упорядочивания букв конкретного языка.

Пример php
setlocale(LC_COLLATE, 'ru_RU.UTF-8');
$arr = ["яблоко" => 1, "абрикос" => 2, "банан" => 3];
ksort($arr, SORT_LOCALE_STRING);
print_r($arr);

Результат зависит от установленной локали и ее поддержки системой. В корректной русской локали ключи будут отсортированы в порядке «абрикос», «банан», «яблоко».

Сортировка массива объектов как значений

Ключи сортируются, значения-объекты остаются теми же экземплярами.

Пример php
class Fruit { public $name; }
$obj1 = new Fruit(); $obj1->name = "Яблоко";
$obj2 = new Fruit(); $obj2->name = "Банан";

$arr = ["z" => $obj2, "a" => $obj1];
ksort($arr);

foreach ($arr as $key => $obj) {
    echo $key . ': ' . $obj->name . "\n";
}
a: Яблоко
z: Банан
Аналоги в других языках

Ksort в Python

В Python для сортировки словаря по ключам используют функцию sorted(), возвращающую новый отсортированный список ключей, или метод sort() для списка ключей. Словари сохраняют порядок вставки, начиная с Python 3.7.

my_dict = {"d": "лимон", "a": "апельсин", "b": "банан"}
sorted_dict = {k: my_dict[k] for k in sorted(my_dict.keys())}
print(sorted_dict)
{'a': 'апельсин', 'b': 'банан', 'd': 'лимон'}

Ksort в Javascript

Объекты в JavaScript не гарантируют порядок ключей. Для сортировки ключей можно получить массив ключей, отсортировать его и создать новый объект.

let obj = {d: "лимон", a: "апельсин", b: "банан"};
let sortedKeys = Object.keys(obj).sort();
let sortedObj = {};
sortedKeys.forEach(key => { sortedObj[key] = obj[key]; });
console.log(sortedObj);
{ a: 'апельсин', b: 'банан', d: 'лимон' }

Ksort в MySQL

В MySQL при выборке данных с помощью ORDER BY происходит сортировка результатов запроса по указанному столбцу. Это не прямая аналогия, а особенность языка запросов.

SELECT * FROM fruits ORDER BY name_key ASC;

В отличие от PHP, где ksort изменяет исходный массив, в Python и JavaScript обычно создается новая отсортированная коллекция.

PHP ksort function comments

En
Ksort Sort an array by key in ascending order