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

PHP - Are the indexes returned by explode() *always* in the same order as the sub-strings occur?

我一直在寻找各种 php docs,但找不到答案。

如果我有一个字符串

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

来自 explode() 的 returned 数组的索引是否总是 按出现顺序排列?

因此,对于上面的字符串:

explode('-', $str);

永远 return:

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

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

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

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

我不确定我是否见过类似 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);
        }
    }
}