亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

[PHP源碼閱讀]explode和implode函數(shù)

Ocean / 582人閱讀

摘要:在實現(xiàn)里面,如果大于,則調(diào)用函數(shù)如果小于,則調(diào)用函數(shù)如果等于,則被當做處理,此時調(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源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。

explode
array explode ( string $delimiter, string $string, [ , $limit ] )

函數(shù)返回由字符串組成的數(shù)組,每個元素都是string的一個子串,被字符串$delimiter作為邊界點分割出來。

參數(shù)說明

limit

如果設(shè)置了limit,且為正數(shù),則返回的數(shù)組最多包含limit個元素,最后的那個元素將包含string的剩余部分。

如果limit是負數(shù),則返回除了最后的-$limit個元素外的所有元素。

如果limit是0,則會被當做1。

delimiter

如果delimiter為空,則函數(shù)返回FALSE。如果delimiter不在string中,且limit為負數(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為負數(shù),limit為-1,返回最后的1個元素外的所有元素。

$arr = explode(",", $str, -1);
print_r($arr);

limit為0,當作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),當參數(shù)為typename是,即類型名稱,sizeof返回類型對應(yīng)對象的大?。划攨?shù)為表達式時,sizeof計算表達式的返回類型對應(yīng)對象的大小。此處,""是表達式,sizeof計算編譯時編譯器分配給""的空間,此時要算上0的長度,因此是1,而strlen函數(shù)不會計算