Как работает бинарное сравнение строк в 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
выполняет те же действия только без учёта регистра символов.