я использую PHP 7.2.11 на моей машине, которая работает на Windows 10 Home Single Language 64-разрядная операционная система.
Я наткнулся на страницу руководства Параметр иглы функции strpos ()
Там это было написано как
игла
Если игла не строка, она преобразуется в целое число и
применяется в качестве порядкового значения символа.
Я не понял смысла вышеприведенного высказывания о игла параметр.
Может кто-нибудь, пожалуйста, объясните мне смысл заявления о игла параметр из руководства по PHP вместе с примером рабочего кода, где не строковое значение передается в параметре $ needle StrPos () функция.
Как выполняется преобразование в целое число типа и как оно применяется в качестве порядкового значения символа?
Я не смог найти такого примера нигде в руководстве или на любом другом сайте.
Было бы лучше, если бы также был предоставлен рабочий пример кодирования вместе с параметром смещения.
Благодарю вас.
$haystack = "maio290";
$needle = ord("a");
var_dump(strpos($haystack,$needle));
Выходы: int(1)
Зачем?
Порядковый номер символа равен числу, которое вы можете найти в нескольких таблицах ASCII. Например, символ «а» равен целому числу 97.
Вот исходный код PHP (или материал, который вам нужен для понимания функции strpos):
static int php_needle_char(zval *needle, char *target)
{
switch (Z_TYPE_P(needle)) {
case IS_LONG:
*target = (char)Z_LVAL_P(needle);
return SUCCESS;
case IS_NULL:
case IS_FALSE:
*target = '\0';
return SUCCESS;
case IS_TRUE:
*target = '\1';
return SUCCESS;
case IS_DOUBLE:
*target = (char)(int)Z_DVAL_P(needle);
return SUCCESS;
case IS_OBJECT:
*target = (char) zval_get_long(needle);
return SUCCESS;
default:
php_error_docref(NULL, E_WARNING, "needle is not a string or an integer");
return FAILURE;
}
}
PHP_FUNCTION(strpos)
{
zval *needle;
zend_string *haystack;
const char *found = NULL;
char needle_char[2];
zend_long offset = 0;
ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(haystack)
Z_PARAM_ZVAL(needle)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(offset)
ZEND_PARSE_PARAMETERS_END();
if (offset < 0) {
offset += (zend_long)ZSTR_LEN(haystack);
}
if (offset < 0 || (size_t)offset > ZSTR_LEN(haystack)) {
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
RETURN_FALSE;
}
if (Z_TYPE_P(needle) == IS_STRING) {
if (!Z_STRLEN_P(needle)) {
php_error_docref(NULL, E_WARNING, "Empty needle");
RETURN_FALSE;
}
found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
Z_STRVAL_P(needle),
Z_STRLEN_P(needle),
ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
} else {
if (php_needle_char(needle, needle_char) != SUCCESS) {
RETURN_FALSE;
}
needle_char[1] = 0;
php_error_docref(NULL, E_DEPRECATED,
"Non-string needles will be interpreted as strings in the future. " \
"Use an explicit chr() call to preserve the current behavior");
found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
needle_char,
1,
ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
}
if (found) {
RETURN_LONG(found - ZSTR_VAL(haystack));
} else {
RETURN_FALSE;
}
}
Нашел здесь: https://github.com/php/php-src/blob/master/ext/standard/string.c
Это означает:
long
: Получить длинное значение и привести его к символу.
null or false
: возвращает 0 (как символ)
true
: возвращает 1 (как символ)
double
: Получить двойное значение, привести его к целому числу (что означает, что все части
после того, как точка потеряна), а затем бросить его в символ.
object
: Получить длинное (?) От объекта и привести его к символу.
Я не настолько глубоко разбираюсь в C или Zend-Engine, и поэтому мог бы объяснить что-то не так. Но это должно быть на самом деле то, что вы искали.
Других решений пока нет …