PHP数组Key强制类型转换实现原理解析


Posted in PHP onSeptember 01, 2020

PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是字符串类型的Hash键值,那么,当一个数组的Key同时拥有字符串和数字时,会产生什么情况呢?

首先来看下面这样一段代码:

$arr = [
  "1" => "a",
  "01" => "b",
  1 => "aa",
  1.1 => "aaa",
  "0.1" => "bb",
];

var_dump($arr);

// array(3) {
//   [1] =>
//   string(3) "aaa"
//   '01' =>
//   string(1) "b"
//   '0.1' =>
//   string(2) "bb"
// }

咦?我们定义的"1"、1下标的值都变成了1.1的"aaa"了?

没错,PHP中的数组Key值只接受数字和字符串类型,当Key是字符串时,会强制转换为数字类型,遵守类型强制转换的规则。浮点数也是同样的道理,直接转换成了向下取整的整型。

那么"0.1"和"01"为什么还在?首先,"01"不是标准的十进制数值,无法转换成整型,所以"01"还是一个字符串下标,那"0.1"呢?它当然也不是一个标准的十进制数值。这里是违背了字符串转型数字的强制类型转换原则的,在变量的强制转换中,这两种字符串都会被转换为0,但在数组中则不会,这里会是一个坑,也是需要注意的地方。

在PHP官方文档中给出的Key值转换说明如下:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

接下来,是笔者曾经做过的一道面试题,和这个类型转换有着非常大的关系,代码如下:

a   = ['a'];
$a[2]  = 'b';
$a[]  = 'c';
$a['1'] = 'd';

// 以下循环的输出结果是?
foreach ($a as $v) {
	echo $v, ',';
}

// 以下循环的输出结果是?
for ($i = 0; $i < count($a); ++$i) {
	echo $a[$i], ' ,';
}

大家先不要运行,直接看代码看看能不能看出这两段代码的输出结果会是什么,然后运行一下,看看结果和你想像的是不是一样。

测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/关于PHP数组Key的强制转换.php

参考资料: https://www.php.net/manual/zh/language.types.array.php

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
10个实用的PHP代码片段
Sep 02 PHP
mysql总结之explain
Feb 27 PHP
php中长文章分页显示实现代码
Sep 29 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 PHP
Yii 2.0中场景的使用教程
Jun 02 PHP
PHP基于ORM方式操作MySQL数据库实例
Jun 21 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 PHP
PHP模糊查询技术实例分析【附源码下载】
Mar 07 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
Apr 04 PHP
Laravel 修改验证异常的响应格式实例代码详解
May 25 PHP
如何用PHP实现分布算法之一致性哈希算法
May 26 PHP
Laravel中GraphQL接口请求频率实战记录
Sep 01 #PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 30 #PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 #PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 #PHP
PHP常用header头定义代码示例汇总
Aug 29 #PHP
PHP isset()及empty()用法区别详解
Aug 29 #PHP
PHP实现简单日历类编写
Aug 28 #PHP
You might like
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
javascript call方法使用说明
2010/01/11 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
jquery中radio checked问题
2015/03/16 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
keras topN显示,自编写代码案例
2020/07/03 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
员工年终演讲稿
2014/01/03 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
小学班主任寄语大全
2014/04/04 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
应届毕业生自荐书
2014/06/18 职场文书
党员检讨书
2014/10/13 职场文书
2014年大学生工作总结
2014/11/20 职场文书
2014年会计工作总结
2014/11/27 职场文书
2015年酒店工作总结
2015/04/28 职场文书
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android