各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

浅谈PHP源码四:关于count函数

管理员 2023-09-05
PHP
127

浅谈PHP源码四:关于count函数

内容导读

收集整理的这篇技术教程文章主要介绍了浅谈PHP源码四:关于count函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2659字,纯文字阅读大概需要4分钟

内容图文

这篇文章主要介绍了关于浅谈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源码一:explode和implode函数

以上就是浅谈PHP源码四:关于count函数的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的浅谈PHP源码四:关于count函数全部内容,希望文章能够帮你解决浅谈PHP源码四:关于count函数所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

扫码关注

qrcode

QQ交谈

回顶部