如果我有一个字符串
$str = '123-456-789-...';
来自explode()
的返回数组的索引是否始终按顺序排列?
所以,对于上面的字符串:
explode('-', $str);
将始终返回:
[
'0' : '123',
'1' : '456',
'2' : '789',
...
]
??或者在幕后发生了一些可能导致索引不匹配的巫术魔术?我所有的测试都是按照正确的顺序进行的,但是我记得某个地方(JS,也许是?),其中索引不能保证与它们进入时相同。
答案 0 :(得分:2)
从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);
}
}
}
答案 1 :(得分:1)