1

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

Функция strcasecmp: сравнение строк в PHP без учёта регистра символов
Раздел: Работа со строками
strcasecmp(string string1, string string2): int
Описание функции strcasecmp

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

Синтаксис
int strcasecmp(string $string1, string $string2)

Функция принимает два обязательных строковых аргумента:

  • string1 — первая сравниваемая строка.
  • string2 — вторая сравниваемая строка.

Возвращаемое значение: целое число меньше 0, если string1 меньше string2; больше 0, если string1 больше string2; и 0, если строки равны без учёта регистра.

Краткие примеры использования
Сравнение простых строк
echo strcasecmp("Hello", "hello");
0
Первая строка лексикографически меньше
echo strcasecmp("Apple", "Banana");
-1
Первая строка лексикографически больше
echo strcasecmp("Banana", "Apple");
1
Сравнение с пустыми строками
echo strcasecmp("", "test");
echo strcasecmp("test", "");
-1
1
Похожие функции в PHP

В PHP существует ряд функций для сравнения строк, каждая со своими особенностями:

  • strcmp() — бинарно-безопасное сравнение строк с учётом регистра. Используется, когда регистр символов важен.
  • strncasecmp() — сравнение без учёта регистра, но только первых N байт строк. Полезно для сравнения начала строк.
  • strnatcasecmp() — «естественное» сравнение без учёта регистра (например, «img2» перед «img12»). Подходит для сортировки строк, содержащих числа.
  • substr_compare() — сравнение частей строк с опцией игнорирования регистра. Используется для сравнения строк с определённого смещения.
  • === (оператор идентичности) — строгое сравнение, проверяет идентичность строк, включая регистр и тип. strcasecmp() предпочтительнее, когда нужен только результат сравнения (больше, меньше, равно) без учёта регистра.
Типичные ошибки
Ожидание булевого значения

Функция возвращает целое число, а не true/false. Ошибкой является прямое использование результата в условиях как булева значения без сравнения с нулём.

// Неправильно
if (strcasecmp($str1, $str2)) {
    echo 'Строки не равны';
}
// Правильно
if (strcasecmp($str1, $str2) !== 0) {
    echo 'Строки не равны';
}
Проблемы с многобайтовыми кодировками

strcasecmp() не учитывает многобайтовые кодировки (например, UTF-8) корректно для не-ASCII символов. Для строк в UTF-8 следует использовать mb_strtolower() перед сравнением или mb_strcasecmp() из расширения mbstring.

echo strcasecmp('Привет', 'привет'); // Может работать некорректно
Может вернуть ненулевое значение в зависимости от окружения
Изменения в версиях PHP

До PHP 7.0.0 функция strcasecmp() могла не быть бинарно безопасной на некоторых системах. Начиная с PHP 7.0.0, функция всегда бинарно безопасна. В PHP 8.0.0 функция теперь выбрасывает ошибку типа TypeError, если переданы аргументы нестрокового типа, в то время как ранее она возвращала 0 или 1 (или даже NULL) и могла вызывать предупреждение E_WARNING.

Расширенные примеры
Сравнение в пользовательской сортировке массива
Пример php
$fruits = ["Orange", "apple", "Banana", "GRAPE"];
usort($fruits, function($a, $b) {
    return strcasecmp($a, $b);
});
print_r($fruits);
Array
(
    [0] => apple
    [1] => Banana
    [2] => GRAPE
    [3] => Orange
)
Использование в callback-функциях для поиска
Пример php
$data = ["Name" => "John", "Age" => 25];
$keyToFind = "name";
$foundKey = array_keys(array_filter(array_keys($data), function($key) use ($keyToFind) {
    return strcasecmp($key, $keyToFind) === 0;
}));
print_r($foundKey);
Array
(
    [0] => Name
)
Проверка вхождения строки без учёта регистра
Пример php
function caseInsensitiveInArray($needle, $haystack) {
    foreach ($haystack as $value) {
        if (strcasecmp($needle, $value) === 0) {
            return true;
        }
    }
    return false;
}
$array = ["Red", "Green", "Blue"];
var_dump(caseInsensitiveInArray("blue", $array));
bool(true)
Сравнение строк с числовыми суффиксами
Пример php
echo strcasecmp("file2", "file10");
echo strnatcasecmp("file2", "file10");
1
-1
Альтернативы в других языках

Strcasecmp в Python

Метод str.casefold() для агрессивного приведения к одному регистру с последующим сравнением, или str.lower(). Прямого аналога нет, обычно используют сравнение через == после приведения к нижнему регистру.

result = "Hello".casefold() == "hello".casefold()
print(result)
True

Strcasecmp в Javascript

Метод localeCompare() с опцией sensitivity: 'accent' или 'base'. Также можно использовать toLowerCase() перед сравнением.

let result = 'Hello'.localeCompare('hello', undefined, { sensitivity: 'accent' });
console.log(result);
0

Strcasecmp в MySQL

Операторы сравнения с учётом или без учёта регистра зависят от коллации столбца. Для сравнения без учёта регистра можно использовать функцию LOWER() или коллацию с суффиксом _ci (case-insensitive).

SELECT 'Hello' LIKE 'hello'; -- Зависит от коллации
SELECT STRCMP(LOWER('Hello'), LOWER('hello'));
1 (если коллация case-sensitive)
0

PHP strcasecmp function comments

En
Strcasecmp Binary safe case-insensitive string comparison