首頁  >  文章  >  後端開發  >  淺談PHP源碼四:關於count函數

淺談PHP源碼四:關於count函數

不言
不言原創
2018-06-28 16:38:262006瀏覽

這篇文章主要介紹了關於淺談PHP源碼四:關於count函數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

在一些面試或考試中常常會看到count函數的身影,於是一探其究竟

對於非數組的count處理
在其程式碼中可以看到

PHP_FUNCTION(count){
    zval *array;
    long mode = COUNT_NORMAL;
    if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE)
        return;
    switch (Z_TYPE_P(array)) {
        case IS_NULL:    //    空值处理
            RETURN_LONG(0);
            break;
        case IS_ARRAY:    //    处理数组,包括其是递归
            RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
            break;
        case IS_OBJECT: {    
    #ifdef HAVE_SPL
        /* it the object implements Countable we call its count() method */
            zval *retval;             if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
                zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval);
                if (retval) {
                    convert_to_long_ex(&retval);
                    RETVAL_LONG(Z_LVAL_P(retval));
                    zval_ptr_dtor(&retval);
                }
            return;
            }
    #endif
        /* if not we return the number of properties (not taking visibility into account) */
            if (Z_OBJ_HT_P(array)->count_elements) {
                RETVAL_LONG(1);
                if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) {
                    return;    
              }
            }
        }
    default:    //    其它情况,如考试中常见的字符串等
        RETURN_LONG(1);
        break;
    }}

在手冊中有說明:

此函數對於對象,如果安裝了SPL,可以透過實作Countable 介面來呼叫count()。此介面只有一個方法 count(),此方法傳回 count() 函數的傳回值。

對於陣列長度的統計,如果mode使用預設值(0),則僅顯示第一維數組的長度
如下所示代碼

 $arr = array(1, 2, 3);
 $arr2 = array($arr, $arr);
 echo count($arr2), &#39;<br />&#39;;
 echo count($arr2, 1);
 /*   输出结果:28*/

如果只是顯示第一維數組,則直接傳回儲存陣列的HashTable的nNumOfElements屬性即可
其實作的程式碼為:

  //    php_count_recursive函数 array.c 251行cnt = zend_hash_num_elements(Z_ARRVAL_P(array)); 
ZEND_API int zend_hash_num_elements(HashTable *ht){
    IS_CONSISTENT(ht);     return ht->nNumOfElements;}

如果想直接執行HashTable的一些簡單操作,猛擊PHP原始碼中HashTable的簡單範例
如果想查看了解陣列儲存或遍歷的方式,猛擊鳥哥的深入理解PHP之數組(遍歷順序)

如果啟動了遞歸,即使用count($arr, 1)
則程式會遞歸呼叫php_count_recursive函數
針對HashTable,程式會遍歷包含這一維數組的雙向鍊錶,然後再遞歸遍歷每個節點存儲的pData,真到遍歷完所有的節點

【感受】
HashTable很強大,如果要計算陣列的長度還是呼叫count函數,重複發明輪子會是一種吃力不討好的事情!

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

淺談PHP原始碼三:關於strrchr, strstr, stristr函數

淺聊PHP原始碼二:關於strlen, strtolower, strtoupper, ord, chr函數

淺談PHP源碼一:explode與implode函數

以上是淺談PHP源碼四:關於count函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn