PHP - explode() 返回的索引是否*总是*与子字符串出现的顺序相同?
PHP - Are the indexes returned by explode() *always* in the same order as the sub-strings occur?
如果我有一个字符串
$str = '123-456-789-...';
来自 explode()
的 returned 数组的索引是否总是 按出现顺序排列?
因此,对于上面的字符串:
explode('-', $str);
将永远 return:
[
'0' : '123',
'1' : '456',
'2' : '789',
...
]
??还是在幕后发生了一些可能导致索引不匹配的巫毒魔法?我所有的测试都按正确的顺序进行,但我记得某个地方(也许是 JS?),索引不能保证与它们进入时相同。
是的,有保证。它执行简单的模式匹配。
我不确定我是否见过类似 explode
的任何语言随机化 return。
取自 PHP 源代码 here,函数 explode 按照给定字符串从左到右的顺序进行。
这是代码本身:
PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit){
char *p1 = ZSTR_VAL(str);
char *endp = ZSTR_VAL(str) + ZSTR_LEN(str);
char *p2 = (char *) php_memnstr(ZSTR_VAL(str), ZSTR_VAL(delim), ZSTR_LEN(delim), endp);
zval tmp;
if (p2 == NULL) {
ZVAL_STR_COPY(&tmp, str);
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
} else {
do {
size_t l = p2 - p1;
if (l == 0) {
ZVAL_EMPTY_STRING(&tmp);
} else if (l == 1) {
ZVAL_INTERNED_STR(&tmp, ZSTR_CHAR((zend_uchar)(*p1)));
} else {
ZVAL_STRINGL(&tmp, p1, p2 - p1);
}
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
p1 = p2 + ZSTR_LEN(delim);
p2 = (char *) php_memnstr(p1, ZSTR_VAL(delim), ZSTR_LEN(delim), endp);
} while (p2 != NULL && --limit > 1);
if (p1 <= endp) {
ZVAL_STRINGL(&tmp, p1, endp - p1);
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
}
}
如果我有一个字符串
$str = '123-456-789-...';
来自 explode()
的 returned 数组的索引是否总是 按出现顺序排列?
因此,对于上面的字符串:
explode('-', $str);
将永远 return:
[
'0' : '123',
'1' : '456',
'2' : '789',
...
]
??还是在幕后发生了一些可能导致索引不匹配的巫毒魔法?我所有的测试都按正确的顺序进行,但我记得某个地方(也许是 JS?),索引不能保证与它们进入时相同。
是的,有保证。它执行简单的模式匹配。
我不确定我是否见过类似 explode
的任何语言随机化 return。
取自 PHP 源代码 here,函数 explode 按照给定字符串从左到右的顺序进行。
这是代码本身:
PHPAPI void php_explode(const zend_string *delim, zend_string *str, zval *return_value, zend_long limit){
char *p1 = ZSTR_VAL(str);
char *endp = ZSTR_VAL(str) + ZSTR_LEN(str);
char *p2 = (char *) php_memnstr(ZSTR_VAL(str), ZSTR_VAL(delim), ZSTR_LEN(delim), endp);
zval tmp;
if (p2 == NULL) {
ZVAL_STR_COPY(&tmp, str);
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
} else {
do {
size_t l = p2 - p1;
if (l == 0) {
ZVAL_EMPTY_STRING(&tmp);
} else if (l == 1) {
ZVAL_INTERNED_STR(&tmp, ZSTR_CHAR((zend_uchar)(*p1)));
} else {
ZVAL_STRINGL(&tmp, p1, p2 - p1);
}
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
p1 = p2 + ZSTR_LEN(delim);
p2 = (char *) php_memnstr(p1, ZSTR_VAL(delim), ZSTR_LEN(delim), endp);
} while (p2 != NULL && --limit > 1);
if (p1 <= endp) {
ZVAL_STRINGL(&tmp, p1, endp - p1);
zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
}
}