Как работает бинарное сравнение строк в 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
!
Почему, одна и та же функция корректно работает без учета регистра, и не хочет работать с учетом регистра?!
Спасибо!
В настройках самого сервера еще поищу причину в кодировке.
Хорошего дня!
генерирую в этой песочнице www.w3schools.com/php/phptryit.asp?filename=tryphp_func_string_strncmp2
КОРРЕКТНО ОТОБРАЖАЕТ, -32.
Вероятно, тормозит APACHE! Поскольку, корректность отображения выборочная! Сервер работает.
В чем возможные причины?
СПАСИБО!
Это скорее всего из-за используемой у вас кодировки. Т.е. в книге используется одна кодировка, а у вас другая.
Т.е. чтобы разобраться как эти функции сравнивают, нужно понять, что каждый символ в кодировке имеет какой-то определённый числовой код.
Работу функции strncmp можно представить следующим образом:
1. Перевод первого символа 1 строки в числовой код:
Например, в кодировке UTF-8 в строке GeeksforGeeks первый символ – это G, он имеет числовой код, равный 71.
2. Перевод первого символа 2 строки в числовой код:
Например, в кодировке UTF-8 в строке geeksforgeeks первый символ – это g, он имеет значение 103.
3. Вычисляется разница этих значений. В данном случае она не равна 0. Следовательно, строки не равны. Эта разность (71 — 103 = -32), а именно -32 возвращается в качестве результата.
Если бы их числовые коды были бы равны, то функция strncmp перешла бы к сравнению вторых символов этих строк и т.д.
Если бы все коды символов строк на указанной длине были бы равны, то функция strncmp возвратила бы 0. В противном случае она возвращает разницу между символами.
Функция strncasecmp выполняет те же действия только без учёта регистра символов.