ホームページ  >  記事  >  バックエンド開発  >  PHP ソース コードについての簡単な説明 4: count 関数について

PHP ソース コードについての簡単な説明 4: count 関数について

不言
不言オリジナル
2018-06-28 16:38:261955ブラウズ

この記事では、主に PHP ソース コード 4 についての簡単な説明を紹介します。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() が 1 つだけあります。

配列の長さの統計については、mode がデフォルト値 (0) を使用する場合、1 次元配列の長さのみが表示されます。

コードは次のとおりです。

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

If最初の次元のみが表示されます。配列を保存する 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 の簡単な例について
配列がどのように保存または走査されるかを確認したい場合は、Brother Bird の PHP 配列の詳細な理解 (走査順序)

## をクリックしてください。再帰が開始される場合は、count($arr, 1) を使用します。
プログラムは php_count_recursive 関数を再帰的に呼び出します。
HashTable の場合、プログラムは、この次元配列を含む二重リンク リストを走査し、保存されている pData を再帰的に走査します。すべてのノードが走査されるまで各ノードで繰り返します


[フィーリング]
HashTable は、配列の長さを計算したり、count 関数を呼び出したりする場合、非常に強力です。感謝のない仕事!

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。


関連する推奨事項:

PHP ソース コードに関する簡単な説明 3: strrchr、strstr、stristr 関数について

A PHP ソース コードについての簡単な説明 2: strlen、strtolower、strtoupper、ord、chr 関数について

PHP ソース コードについての簡単な説明 1:explode 関数と implode 関数

以上がPHP ソース コードについての簡単な説明 4: count 関数についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。