• PHP

Как работает бинарное сравнение строк в PHP?

Задействуйте.

Помогите разобраться с вопросом бинарного сравнения строк в PHP.

Бинарное сравнение без учета регистра выводит на экран 2 в нижеописанном примере:

$str1 = "GeeksforGeeks"; 
$str2 = "eeeksforgeeks"; 
print_r(strncasecmp($str1, $str2, 13));

По моему правильно, насколько мне удалось осмыслить эти вещи.

Когда использую эту же функцию, но с учетом регистра:

$str1 = "GeeksforGeeks"; 
$str2 = "zeeksforgeeks"; 
print_r(strncmp($str1, $str2, 13));

Выводит -1. Отображается информация как при обычном сравнении (1, 0 или -1).

Нашел значение -32 в пособии для выражения:
$str1 = "GeeksforGeeks"; 
$str2 = "geeksforgeeks"; 
print_r(strncmp($str1, $str2, 13));
Но, на экран у меня, по-прежнему, выводит -1!

Почему, одна и та же функция корректно работает без учета регистра, и не хочет работать с учетом регистра?!

Спасибо!

Ответы: 3

Аноним
Аноним

Спасибо, Александр. Ваш ответ пролил свет на некие вещи, в том числе на сам алгоритм сравнения строк (немного по-другому представлялась картина).

В настройках самого сервера поищу кодировку.

Хорошего дня!

Аноним
Аноним

Подключен Apache HTTP Server!

Генерирую в этой песочнице. Корректно отображает: -32.

Вероятно, тормозит Apache! Поскольку, корректность отображения выборочная! Сервер работает.

В чем возможные причины?

Спасибо!

Аноним
Аноним

Здравствуйте!

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

Работу функции strncmp можно представить следующим образом:

1) Перевод первого символа первой строки в числовой код:

Например, в кодировке UTF-8 в строке GeeksforGeeks первый символ – это G, он имеет числовой код, равный 71. 2) Перевод первого символа второй строки в числовой код.

Например, в кодировке UTF-8 в строке geeksforgeeks первый символ – это g, он имеет значение 103.

3) Вычисляется разница этих значений. В данном случае она не равна 0. Следовательно, строки не равны. Эта разность: 71 - 103 = -32. Поэтому, -32 возвращается в качестве результата.

Если бы их числовые коды были бы равны, то функция strncmp перешла бы к сравнению вторых символов этих строк и так далее.

Если бы все коды символов строк на указанной длине были бы равны, то функция strncmp возвратила бы 0. В противном случае она возвращает разницу между символами.

Функция strncasecmp выполняет те же действия только без учёта регистра символов.