位置: 编程技术 - 正文

深入理解PHP中的count函数(怎么理解php语言)

编辑:rootadmin

推荐整理分享深入理解PHP中的count函数(怎么理解php语言),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解php:高级技巧,怎么理解php语言,深入理解php中的问题,深入理解php中的问题,深入理解php内核,深入理解php中的数字,深入理解php中的问题,深入理解php中的数字,内容如对您有帮助,希望把文章链接给更多的朋友!

在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现。

我在github上有对PHP源码更详细的注解。感兴趣的可以围观一下,给个star。PHP5.4源码注解。可以通过commit记录查看已添加的注解。

count

count函数计算数组或者对象里面的所有元素个数。

对于对象来说,如果你安装了SPL扩展,可以通过实现Countable接口来调用count函数。Countable接口有且仅有一个方法Countable::count(),该方法的返回count()函数的返回值。

参数说明

mode

如果参数mode设为COUNT_RECURSIVE(或1),count()会递归地计算该数组。在计算多维数组的时候特别有用。

如果第一个参数不是数组或者实现Countable接口的对象,count函数将返回1。

注意:count函数可以检测递归避免无限循环,但会在遇到无限递归或得到比期望值大的时候返回E_WARNING提示。

运行示例

普通应用

多维数组

数字和字符串

普通对象

array-like对象

实现Countable接口对象

运行步骤

深入理解PHP中的count函数(怎么理解php语言)

进入switch语句检测参数类型

如果是NULL,直接返回0

如果是数组,调用php_count_recursive函数机选数组元素个数

如果是对象,先检查是否为数组对象(array-like object),如果是,则计算数组对象的数量

否则,如果对象实现了Countable接口,则调用Countable的count方法

最后,其他类型比如整型数组或字符串,都返回1。

源码解读

如果是普通数组,count函数会调用php_count_recursive函数实现其功能的运行步骤如下:

如果当前hash Bucket被递归访问的次数大于1,说明重复递归,染回E_WARNING错误

否则计算当前数组层数的数组元素个数

如果有递归参数选项,则继续递归访问

如果参数是对象类型,实现时会先判断handler是否被定义。而handler是PHP内核中对象的结构体,其中包含有count_elements字段,实际上是一个函数。如果某个对象表现得想数组一样,即通常说的array-like object,那么就会执行count_elements函数。具体实现是类继承PHP的ArrayObject,并在类里面实现count函数,具体调用的就是count函数,如果类没有实现count函数,则count返回0,否则返回对象的count函数的返回值。

如果是其他的数据类型

1、字符串

2、数字

3、对象分支中两个if判断都为false的情况,即没有继承ArrayObject且没有实现Countable接口。

这些类型通通返回1。

需要注意的是,如果需要计算的是对象的属性数量,可以先将对象转换成数组,然后调用count函数。如:

$count_value = count((array) $user);

小结

阅读count函数的源码过程中,在其中一步卡住了,就是if (Z_OBJ_HT_P(array)->count_elements)这一步,因为始终无法写出进入这个分支的demo,在网上搜索了很多资料也未果,因此请教了TIPI的reeze,最终得到了想要的答案。不懂就要问,哈哈。

基于PHP生成简单的验证码 废话不多说了,直接给大家贴代码了,具体代码如下所示:for($i=0;$i5;$i++){$rand.=dechex(rand(1,));//随机数进制1-F生成5个}$im=imagecreatetruecolor(,);//验证码

PHP微信公众号自动发送红包API 本文实例为大家分享了PHP微信公众号自动发送红包API代码,分享给大家供大家参考。具体如下:贴出核心接口代码至于数据自己填写,接口测试OKwecha

yii2分页之实现跳转到具体某页的实例代码 先上图看效果,大家感觉还错请参考功能怎么实现的!从上图中不难看出,我们制定跳转到某页的功能是基于linkpager之上的扩展,这根我们之前实现的

标签: 怎么理解php语言

本文链接地址:https://www.jiuchutong.com/biancheng/295528.html 转载请保留说明!

上一篇:PHP表单数据写入MySQL数据库的代码(php表单内容写入txt)

下一篇:基于PHP生成简单的验证码(php代码生成)

  • 税金及附加可以为负数吗
  • 小规模企业可以收增值税专用发票吗
  • 已认证发票对方红冲应该怎么做账
  • 代扣代缴完税凭证是什么
  • 子公司计提的盈余公积如何抵消
  • 我公司给对方公司付款
  • 自然人能申请破产吗?
  • 代购的货可以退吗
  • 事业单位发票名称是原来的怎么办
  • 股权转让个税是转让方交吗
  • 企业理财产品收益要交企业所得税吗
  • 单位车辆卖给个人怎么开票
  • 企业个人所得税申报系统官网
  • 装卸费怎么开票
  • 增值税专用发票验票
  • 免征增值税和附加税区别
  • 税盘显示已过开票截止日期
  • 电子承兑到期收款怎么做账务
  • 金融企业不良资产批量收购处置业务
  • 企业的营业外收入包括
  • 商业企业向供货方收取的返还收入
  • 预收账款可以计入
  • 事业单位授权支付可以取现吗
  • 自建用地是什么性质
  • 工商年报缴费基数是什么意思
  • 公司雇用临时工人工资需要到税务局开发票吗
  • 人力资源服务代缴社保税率是多少
  • 居民企业境外所得税率
  • element ui el-tree
  • 转让技术所有权计入什么科目
  • 简述php的概念和特点
  • 支票的提示付款期限为自出票日期
  • 已知税额和不含税额求税率
  • vscode写前端代码,如何运行
  • 申报表中的免税销售额是收入吗
  • 无形资产转让账务怎么做
  • 反写必须15号之前吗
  • 固定资产转为投资性房地产属于会计政策变更
  • 收到的赠品直接用吗
  • 哪几类账户期末余额最大
  • 建筑业营改增前后区别
  • 计入固定资产成本的税费有哪些
  • MySQL 数据库中,用于事务授权控制的关键词是下面哪个?
  • mongo删除数据库命令
  • 购辅助材料会计分录
  • 公司采购不含税产品合法吗
  • 制造行业结转成本
  • 普票不能抵扣要他干嘛
  • 母公司收取子公司利润
  • 过了汇算清缴还能调整以前年度
  • Ubuntu上安装jdk
  • 利润表的期末余额怎么算出来的
  • 制造费用的结转正确的是( )
  • 材料已入库后收回怎么办
  • 股权转让如何进行资产评估的
  • 固定资产清理在贷方怎么结转
  • 固定资产的后续支出应如何进行会计处理
  • 社平工资调整补差能补多少
  • 外账进销存单据是怎么弄的?
  • 什么是摊余成本法
  • mac如何通过终端启动
  • win 10 ie8
  • mac上怎么用ppt
  • 限制root用户远程登录
  • win8系统怎么设置
  • win8计算机管理员权限
  • win10系统应用和浏览器控制出现感叹号
  • 系统应用没有相机
  • 基于linux的mplayer音乐播放器
  • JS写XSS cookie stealer来窃取密码的步骤详解
  • dos命令不能执行怎么回事
  • 从零基础开始
  • linux pop
  • 轮廓理论
  • Android之Service
  • easyui-dialog
  • 地税登记证和税务登记证是一样的吗
  • 如何在国税网上做企业会计制度备
  • 江苏印花税申报操作流程
  • 湖北省税务局税务纪检委员时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设