2017-09-01 64 views
1

我一直在尋找各種phpdocs,但無法找到答案。PHP - explode()*總是以與子字符串相同的順序返回索引嗎?

如果我有一個字符串

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

將返回數組從explode()總是指標在出現的順序?

因此,對於上面的字符串:

explode('-', $str); 

總是回報:

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

?或者幕後發生了一些巫術魔法,可能會導致索引不匹配?我所有的測試都是按照正確的順序進行的,但是我記得有些地方(JS,也許?),其中索引不能保證與他們進入的地方相同。

+1

這似乎隱含如此不言而喻。 – deceze

+1

@deceze我同意,但我以前曾被這樣的事情燒過。我只希望文檔能夠明確地這樣說。 – Birrel

回答

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

是的,它是有保證的。它執行簡單的模式匹配。

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

我不知道我見過的任何語言類似explode隨機返回。

+0

我已經完成了大量的測試用例,都顯示了與您的示例相同的內容,但是您能否指出任何特定的文檔說明?一個例子沒有答案。 – Birrel

+1

源代碼可以免費查看:https://github.com/php/php-src/blob/master/ext/standard/string.c - 我會爭辯說,沒有相反的證據和例子,並查看源代碼很清楚,函數每次調用時都會如何運行。 – neuromatter

+1

@neuromatter,我寧願說:函數如何運作,直到有人因爲任何理由或無理由改變它。想到將list()函數從PHP5更改爲PHP7的變化。 [簡單示例](https://3v4l.org/UjrLf)。 – jh1711

相關問題