這篇文章主要介紹了關於淺談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), '<br />'; 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源碼四:關於count函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!