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 相关文章推荐
如何在PHP中进行身份认证
Oct 09 PHP
PHP+MYSQL 出现乱码的解决方法
Aug 08 PHP
phpmyadmin导入(import)文件限制的解决办法
Dec 11 PHP
PHP IPV6正则表达式验证代码
Feb 16 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
编写php应用程序实现摘要式身份验证的方法详解
Jun 08 PHP
php实现memcache缓存示例讲解
Dec 04 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
php用户注册信息验证正则表达式
Nov 12 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 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/12/23 PHP
php验证手机号码
2015/11/11 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
JavaScript解八皇后问题的方法总结
2016/06/12 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
java判断三位数的实例讲解
2019/06/10 Python
Python Sympy计算梯度、散度和旋度的实例
2019/12/06 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
HTML5 input元素类型:email及url介绍
2013/08/13 HTML / CSS
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
总监职责范文
2013/11/09 职场文书
农贸市场管理制度
2014/01/31 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
企业承诺书格式
2014/05/21 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
初中生毕业评语
2014/12/29 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
深入理解python多线程编程
2021/04/18 Python
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers