W3docs

natcasesort()

Подробное руководство по функции natcasesort() в PHP: естественная сортировка массива без учёта регистра.

Введение

natcasesort() сортирует массив, используя алгоритм естественного порядка с нечувствительным к регистру сравнением. «Естественный порядок» означает, что строки упорядочиваются так, как это делал бы человек — например, img10 идёт после img2, а не перед ним, как при обычной алфавитной сортировке.

На этой странице рассматривается, что такое естественный порядок, чем natcasesort() отличается от natsort() и sort(), а также нюансы, связанные с ключами и возвращаемыми значениями.

Синтаксис

natcasesort(array &$array): bool

Функция принимает массив по ссылке, сортирует его «на месте» и возвращает true в случае успеха. Результат не нужно присваивать переменной — переданный массив изменяется напрямую.

ПараметрПоведение
СортировкаНа месте (по ссылке)
КлючиСохраняются — пары ключ/значение остаются связанными
ПорядокПо возрастанию, естественный, без учёта регистра
Возвращаетbool (true в случае успеха)

Зачем нужен естественный порядок

При обычной алфавитной сортировке строки сравниваются посимвольно, поэтому "img10" оказывается перед "img2", потому что 1 меньше 2. Это редко соответствует ожиданиям человека, когда имена файлов или метки содержат числа. Естественный порядок рассматривает последовательности цифр как числа, давая понятный для человека результат.

Базовый пример

php— editable, runs on the server

Вывод:

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.

Практика

Практика
Какова функция 'natcasesort()' в PHP?
Какова функция 'natcasesort()' в PHP?
Was this page helpful?