natcasesort()
Подробное руководство по функции natcasesort() в PHP: естественная сортировка массива без учёта регистра.
Введение
natcasesort() сортирует массив, используя алгоритм естественного порядка с нечувствительным к регистру сравнением. «Естественный порядок» означает, что строки упорядочиваются так, как это делал бы человек — например, img10 идёт после img2, а не перед ним, как при обычной алфавитной сортировке.
На этой странице рассматривается, что такое естественный порядок, чем natcasesort() отличается от natsort() и sort(), а также нюансы, связанные с ключами и возвращаемыми значениями.
Синтаксис
natcasesort(array &$array): boolФункция принимает массив по ссылке, сортирует его «на месте» и возвращает true в случае успеха. Результат не нужно присваивать переменной — переданный массив изменяется напрямую.
| Параметр | Поведение |
|---|---|
| Сортировка | На месте (по ссылке) |
| Ключи | Сохраняются — пары ключ/значение остаются связанными |
| Порядок | По возрастанию, естественный, без учёта регистра |
| Возвращает | bool (true в случае успеха) |
Зачем нужен естественный порядок
При обычной алфавитной сортировке строки сравниваются посимвольно, поэтому "img10" оказывается перед "img2", потому что 1 меньше 2. Это редко соответствует ожиданиям человека, когда имена файлов или метки содержат числа. Естественный порядок рассматривает последовательности цифр как числа, давая понятный для человека результат.
Базовый пример
Вывод:
Array
(
[3] => Boston
[2] => Chicago
[1] => Los Angeles
[0] => New York
[4] => San Francisco
)Обратите внимание: ключи (3, 2, 1, 0, 4) не переиндексируются — каждое значение сохраняет свой исходный ключ. Если нужно сбросить ключи до 0, 1, 2…, используйте sort() или примените к результату array_values().
natcasesort() vs natsort() vs sort()
Разницу между этими тремя функциями проще всего увидеть на строках смешанного регистра с числами:
<?php
$files = array("IMG10.png", "img12.png", "img2.png", "IMG1.png", "img10.png");
$a = $files;
natcasesort($a); // natural + case-insensitive
print_r($a);Вывод:
Array
(
[3] => IMG1.png
[2] => img2.png
[0] => IMG10.png
[4] => img10.png
[1] => img12.png
)При использовании natsort() (с учётом регистра) те же данные сортируются иначе, поскольку буквы верхнего регистра при сравнении меньше строчных — поэтому IMG10 оказывается перед img2:
Array
(
[3] => IMG1.png
[0] => IMG10.png
[2] => img2.png
[4] => img10.png
[1] => img12.png
)А sort() (обычная, не естественная) переиндексирует ключи и помещает img10/img12 перед img2:
Array
(
[0] => IMG1.png
[1] => IMG10.png
[2] => img10.png
[3] => img12.png
[4] => img2.png
)Используйте natcasesort(), когда порядок должен соответствовать человеческой логике и регистр не должен учитываться — например, при отображении загруженных пользователями файлов, где кто-то мог написать IMG или img.
Особенности
- Функция возвращает bool, а не отсортированный массив.
$sorted = natcasesort($arr);присвоит$sortedзначениеtrue, а не ваши данные. Данные находятся в$arr. - Ключи сохраняются. Это нарушает код, который рассчитывает на ключи с основанием
0. Оберните вarray_values($arr), если нужен чистый список. - Нестроковые значения сравниваются как строки. Числа, булевы значения и т. д. приводятся к строкам перед сравнением.
Связанные функции
natsort()— естественный порядок, с учётом регистра.sort()— обычная сортировка по возрастанию, переиндексирует ключи.asort()— сортировка по возрастанию с сохранением ключей (не естественная).usort()— сортировка с пользовательской функцией сравнения.
Доступно начиная с PHP 4.0.0.