国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[PHP源碼閱讀]explode和implode函數

Ocean / 511人閱讀

摘要:在實現里面,如果大于,則調用函數如果小于,則調用函數如果等于,則被當做處理,此時調用函數將添加到數組中。找到分隔符的位置之后,就調用函數將分隔得到的字符串插入到返回數組里。此函數可以看作是的逆向過程。調用函數做字符串的連接。

explode和implode函數主要用作字符串和數組間轉換的操作,比如獲取一段參數后根據某個字符分割字符串,或者將一個數組的結果使用一個字符合并成一個字符串輸出。在PHP中經常會用到這兩個函數,因此有必要了解一下其原理。

我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。

explode
array 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函數不會計算