PHP - explode()*返回的索引是否始终与子字符串的顺序相同?

时间:2017-09-01 21:04:41

标签: php explode

我一直在查看各种php docs,但无法找到答案。

如果我有一个字符串

$str = '123-456-789-...';

来自explode() 的返回数组的索引是否始终按顺序排列?

所以,对于上面的字符串:

explode('-', $str);

始终返回:

[
  '0' : '123', 
  '1' : '456', 
  '2' : '789', 
  ...
]

??或者在幕后发生了一些可能导致索引不匹配的巫术魔术?我所有的测试都是按照正确的顺序进行的,但是我记得某个地方(JS,也许是?),其中索引不能保证与它们​​进入时相同。

2 个答案:

答案 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)

是的,这是有保证的。它执行简单的模式匹配。

示例:https://eval.in/853910

我不确定我是否曾在任何一种语言中看到类似explode的内容随机化返回。