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