摘要:在實現里面,如果大于,則調用函數如果小于,則調用函數如果等于,則被當做處理,此時調用函數將添加到數組中。找到分隔符的位置之后,就調用函數將分隔得到的字符串插入到返回數組里。此函數可以看作是的逆向過程。調用函數做字符串的連接。
explode和implode函數主要用作字符串和數組間轉換的操作,比如獲取一段參數后根據某個字符分割字符串,或者將一個數組的結果使用一個字符合并成一個字符串輸出。在PHP中經常會用到這兩個函數,因此有必要了解一下其原理。
我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。
explodearray explode ( string $delimiter, string $string, [ , $limit ] )
函數返回由字符串組成的數組,每個元素都是string的一個子串,被字符串$delimiter作為邊界點分割出來。
參數說明limit
如果設置了limit,且為正數,則返回的數組最多包含limit個元素,最后的那個元素將包含string的剩余部分。
如果limit是負數,則返回除了最后的-$limit個元素外的所有元素。
如果limit是0,則會被當做1。
delimiter
如果delimiter為空,則函數返回FALSE。如果delimiter不在string中,且limit為負數,則返回空數組。
運行示例$str = "hello,world,heiheihei,php";
先來看看不設置limit的情況
$arr = explode(",", $str); print_r($arr);
limit為正數時,limit設為1,最多返回1個元素。
$arr = explode(",", $str, 1); print_r($arr);
limit為負數,limit為-1,返回最后的1個元素外的所有元素。
$arr = explode(",", $str, -1); print_r($arr);
limit為0,當作1處理。
$arr = explode(",", $str, 0); print_r($arr);explode執行步驟
1、接收參數,處理參數為空的情況
2、創建函數中使用的局部變量
3、根據limit的值調用不同的函數分隔字符串
explode函數的核心實現是php_explode函數,下面是該函數的執行流程圖:
php_explode函數核心代碼:
if (p2 == NULL) { // 找不到分隔符,直接返回整個字符串 add_next_index_stringl(return_value, p1, Z_STRLEN_P(str), 1); } else { do { // 將p1添加到return_value數組中 add_next_index_stringl(return_value, p1, p2 - p1, 1); p1 = p2 + Z_STRLEN_P(delim); } while ((p2 = php_memnstr(p1, Z_STRVAL_P(delim), Z_STRLEN_P(delim), endp)) != NULL && --limit > 1); // 將最后一個值添加到return_value if (p1 <= endp) add_next_index_stringl(return_value, p1, endp-p1, 1); }源碼解讀
sizeof("") == 0。sizeof有兩種用法,sizeof(typename)和sizeof(expression),當參數為typename是,即類型名稱,sizeof返回類型對應對象的大小;當參數為表達式時,sizeof計算表達式的返回類型對應對象的大小。此處,""是表達式,sizeof計算編譯時編譯器分配給""的空間,此時要算上0的長度,因此是1,而strlen函數不會計算