淺談PHP源碼十九:關於array_file,range函數

來源:互聯網
上載者:User
這篇文章主要介紹了關於淺談PHP源碼十九:關於array_file,range函數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

淺談PHP源碼十九:關於array_file,range函數

array_fill
(PHP 4 >= 4.2.0, PHP 5)

array_fill — 用給定的值填充數組
說明
array array_fill ( int start_index, int num, mixed value )

array_fill() 用 value 參數的值將一個數組填充 num 個條目,鍵名由 start_index 參數指定的開始。注意 num 必須是一個大於零的數值,否則 PHP 會發出一條警告。

對於參數start_index,只能是字串,整形,浮點型
其源碼如下:

switch (Z_TYPE_PP(start_key)) {case IS_STRING:case IS_LONG:case IS_DOUBLE:    .......    convert_to_long_ex(start_key);    ......}

程式首先賦值給return_value第一個值,然後迴圈num – 1次: 給這個值添加refcount,並將它添加到return_value的Hash Table中

range
(PHP 3 >= 3.0.8, PHP 4, PHP 5)

range — 建立一個包含指定範圍單元的數組
說明
array range ( mixed low, mixed high [, number step] )

range() 返回數組中從 low 到 high 的單元,包括它們本身。如果 low > high,則序列將從 high 到 low。

新參數: 可選的 step 參數是 PHP 5.0.0 新加的。

如果給出了 step 的值,它將被作為單元之間的步進值。step 應該為正值。如果未指定,step 則預設為 1。

從代碼可以看出,本函數僅支援字元數組,浮點數組和整形數組,並且支援遞增和遞減兩種形式(在版本4.0.1之後才有)
以字元數組為例:

 if (Z_TYPE_P(zlow) == IS_STRING && Z_TYPE_P(zhigh) == IS_STRING && Z_STRLEN_P(zlow) >= 1 && Z_STRLEN_P(zhigh) >= 1) {    int type1, type2;    unsigned char *low, *high;    long lstep = (long) step;     type1 = is_numeric_string(Z_STRVAL_P(zlow), Z_STRLEN_P(zlow), NULL, NULL, 0);    type2 = is_numeric_string(Z_STRVAL_P(zhigh), Z_STRLEN_P(zhigh), NULL, NULL, 0);    if (type1 == IS_DOUBLE || type2 == IS_DOUBLE || is_step_double) {        goto double_str;    } else if (type1 == IS_LONG || type2 == IS_LONG) {        goto long_str;    }    convert_to_string(zlow);    //    轉化為字串,此函數的實現在zend_operators.c的536行:ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC)    convert_to_string(zhigh);    low = (unsigned char *)Z_STRVAL_P(zlow);    //    當所給字串長度大於1時,取第一個字元    high = (unsigned char *)Z_STRVAL_P(zhigh);     if (*low > *high) { //    遞減數組    if (lstep <= 0) {        err = 1;        goto err;    }    for (; *low >= *high; (*low) -= (unsigned int)lstep) {        add_next_index_stringl(return_value, low, 1, 1);        if (((signed int)*low - lstep) < 0) {            break;        }    }    } else if (*high > *low) { //    遞增數組    if (lstep <= 0) {        err = 1;        goto err;    }    for (; *low <= *high; (*low) += (unsigned int)lstep) {        add_next_index_stringl(return_value, low, 1, 1);        if (((signed int)*low + lstep) > 255) {    //    只支援ASCII的255個字元            break;        }    }    } else {    //    開始和結束相等,則只返回包含一個元素的數組        add_next_index_stringl(return_value, low, 1, 1);}

對於浮點型和整形的處理基本類似,只有寫入Hash Table的方法不同

浮點型用的是add_next_index_double
整形用的是add_next_index_long

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.