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

 更新时间:2020-09-24 15:02:23   作者:佚名   我要评论(0)

PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是

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数组式访问接口ArrayAccess用法分析
  • php访问数组最后一个元素的函数end()用法
  • PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
  • PHP如何使用array_unshift()在数组开头插入元素
  • PHP读取远程txt文档到数组并实现遍历
  • PHP基于array_unique实现二维数组去重
  • PHP二维数组分页2种实现方法解析
  • PHP数组访问常用方法解析

相关文章

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

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

    PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是
    2020-09-24
  • PHP实现计算器小功能

    PHP实现计算器小功能

    本文实例为大家分享了PHP实现计算器小功能的具体代码,供大家参考,具体内容如下 <&#63;php if (isset($_POST['sub'])) { $f = true; $error = "有以上问题: <
    2020-09-24
  • PHP autoload使用方法及步骤详解

    PHP autoload使用方法及步骤详解

    我们知道在PHP4里面,当我们使用一个类的时候,必须将该类所以文件使用include或require加进来,这样我们就可以使用类了。 而对于PHP5来说也可以使用在PHP4里面的
    2020-09-24
  • PHP如何使用array_unshift()在数组开头插入元素

    PHP如何使用array_unshift()在数组开头插入元素

    PHP array_unshift() 函数用来在数组开头插入一个或多个元素,其语法如下: int array_unshift ( array &$arr , mixed $value1 [, mixed $value2, mixed $value3 ..
    2020-09-24
  • PHP实现文件上传与下载

    PHP实现文件上传与下载

    本文实例为大家分享了PHP实现文件上传与下载的具体代码,供大家参考,具体内容如下 主页index.php <html> <head> <title>图片操作</title> <style> #contains {
    2020-09-24
  • PHP延迟静态绑定使用方法实例解析

    PHP延迟静态绑定使用方法实例解析

    PHP的继承模型中有一个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难。我们来看一下代码清单5-11中的例子。 代码清单5-11 意想不到的继承
    2020-09-24
  • PHP终止脚本运行三种实现方法详解

    PHP终止脚本运行三种实现方法详解

    PHP中,终止脚本运行有三种方式:主脚本程序中使用return、脚本中使用exit()、die(),三者所在的脚本文件他们之后的代码都不会执行。 1.die( ) 和 exit( ) 在PHP中,
    2020-09-24
  • PHP实现简单日历类编写

    PHP实现简单日历类编写

    用PHP实现日历类的编写,供大家参考,具体内容如下 calendar.class.php <&#63;php /* * 创建一个日历类 * * */ //修改默认时区 date_default_timezone_set("PRC
    2020-09-24
  • 如何在PHP中读写文件

    如何在PHP中读写文件

    在PHP中读写文件,可以用到一下内置函数: 1.fopen(创建文件和打开文件) 语法: fopen(filename,mode) filename,规定要打开的文件。mode,打开文件的模式,可
    2020-09-24
  • PHP超全局变量实现原理及代码解析

    PHP超全局变量实现原理及代码解析

    超全局变量在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。 PHP 超全局变量 PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部
    2020-09-24

最新评论