Maison  >  Article  >  développement back-end  >  Une brève discussion sur le code source PHP 4 : à propos de la fonction count

Une brève discussion sur le code source PHP 4 : à propos de la fonction count

不言
不言original
2018-06-28 16:38:262008parcourir

Cet article présente principalement le code source PHP 4 : concernant la fonction de comptage, elle a une certaine valeur de référence. Maintenant, je la partage avec vous. Les amis dans le besoin peuvent s'y référer

Dans certaines interviews ou examens. voir souvent la fonction de comptage, nous avons donc regardé de plus près

Pour le traitement de comptage des non-tableaux
vous pouvez le voir dans le code

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;
    }}

C'est expliqué dans le manuel :

Pour les objets, si SPL est installé, cette fonction peut appeler count() en implémentant l'interface Countable. Cette interface n'a qu'une seule méthode, count(), qui renvoie la valeur de retour de la fonction count().

Pour les statistiques de longueur du tableau, si le mode utilise la valeur par défaut (0), seule la longueur du tableau de première dimension sera affichée
Le code est le suivant

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

Si seule la longueur du tableau de première dimension est affichée Tableau unidimensionnel, alors renvoyez directement l'attribut nNumOfElements du HashTable qui enregistre le tableau
Le code d'implémentation est :

  //    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;}

Si vous souhaitez exécuter directement quelques opérations simples de HashTable, cliquez sur HashTable dans le code source PHP Un exemple simple
Si vous voulez voir comment les tableaux sont stockés ou parcourus, cliquez sur la compréhension approfondie de Brother Bird des tableaux PHP (traversal order)

Si la récursion est démarrée, utilisez count($ arr, 1)
Le programme appellera récursivement la fonction php_count_recursive
Pour HashTable, le programme parcourra la liste doublement chaînée contenant ce tableau dimensionnel, puis parcourez récursivement les pData stockés dans chaque nœud jusqu'à ce que tous les nœuds soient traversés

[Feeling]
HashTable est très puissant. ou appeler la fonction count, réinventer la roue sera une tâche ingrate !

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Une brève discussion sur le code source PHP trois : à propos des fonctions strrchr, strstr et stristr

A brève discussion sur le code source PHP deux : à propos des fonctions strlen, strtolower, strtoupper, ord, chr

Une brève discussion sur le code source PHP un : les fonctions d'explosion et d'implosion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn