Я использую PHP 7.2.8 на своем компьютере с операционной системой Windows 10.
Я наткнулся на следующий текст из описания Параметр 'needle' в функции strpos(), указанный в Руководстве по PHP:
needle
Если needle не является строкой, оно преобразуется в целое число и применяется как порядковый номер символа.
Из приведенного выше утверждения о параметре 'needle' я не понимаю, как работает функция strpos();
, когда параметр "needle" функции strpos() содержит преобразованное целочисленное значение, которое нельзя применить как порядковое значение любого символа.
Может кто-нибудь объяснить фактическое значение утверждения из руководства, когда параметр «игла» функции strpos() содержит преобразованное целочисленное значение, которое не может быть применено в качестве порядкового значения любого символа в простой для понимания, простой и ясной форме. язык?
Для меня и других обучающихся людей было бы лучше, если бы вы могли предоставить пару подходящих примеров рабочего кода функции strpos()
, где параметр «игла» функции strpos() содержит преобразованное целочисленное значение, которое не может быть применено в качестве порядкового значения любого символ.
Благодарю вас.
ord("A")
? Что возвращаетstrpos("CBA", ord("A"))
? Что возвращаетstrpos("CBA", 65)
? ...и т.д. - person trincot   schedule 22.08.2018needle
, будет преобразовано вchar
(внутренний тип данных C, размер которого составляет один байт). Преобразование будет зациклено (т. е. будут сохранены только 8 младших битов), что означает, чтоvar_dump(strpos('foo', ord('o')+256));
даст1
в качестве ответа, так же, какvar_dump(strpos('foo', ord('o')));
. Если вы снова зададите вопрос или этот вопрос будет открыт повторно, я дам соответствующие ссылки. - person MatsLindh   schedule 22.08.2018ord
возвращает десятичное значение первого байта символа. Поэтому, если он больше 255, он вернет значение первого байта (от 0 до 255). Вы можете проверить это, выполнив код, подобныйprint_r(chr(ord("€")));
. Обратите внимание, что он выводитâ
, потому чтоord("€")
оценивается как 226, аchr(226)
возвращаетâ
. - person Anthony   schedule 22.08.2018var_dump(strpos('€fo', ord('€')+256));
возвращает0
, как и ожидалось, ноvar_dump(strpos('â€fo', ord('€')+256));
возвращает2
Таким образом, наличие двух › 255 символов, кажется, отбрасывает это. - person Anthony   schedule 22.08.2018strpos
предоставляется правильная строка, что означает, чтоstrpos
всегда выполняет преобразование порядкового номера, даже когда строка предоставляется для иглы:var_dump(strpos('â€fo', '€'));
возвращаетint(2)
вместоint(1)
, так же, как передача целое число как игла. - person Anthony   schedule 22.08.2018strpos
рассматривать только отдельные байты, а не сами символы. Поскольку у вас есть многобайтовая кодовая точка UTF в качестве первой буквы во втором примере, перед знаком евро есть два байта, что дает2
в качестве ответа. - person MatsLindh   schedule 22.08.2018strpos
не даст надежного ответа с многобайтовыми строками. Если бы это было просто предназначено для указания позиции байта, оно называлось быbytepos
. Ясно, что если бы у кого-то была многобайтовая строка и ему нужно было бы знать позицию первого€
(нужна правильная позиция этого символа, а не просто проверка, существует ли он в строке),strpos
не предоставил бы эту позицию надежно. - person Anthony   schedule 22.08.2018mbstring
имеетmb_strpos
для работы с кодировками многобайтовых строк. - person MatsLindh   schedule 22.08.2018