当前位置:首页 > PHP教程 > php数组 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-25 10:19:54 浏览: 评论:0 

这篇文章主要介绍了PHP数组Key强制类型转换实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。

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

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

  1. $arr = [ 
  2.   "1" => "a"
  3.   "01" => "b"
  4.   1 => "aa"
  5.   1.1 => "aaa"
  6.   "0.1" => "bb"
  7. ]; 
  8.  
  9. var_dump($arr); 
  10.  
  11. // array(3) { 
  12. //   [1] => 
  13. //   string(3) "aaa" 
  14. //   '01' => 
  15. //   string(1) "b" 
  16. //   '0.1' => 
  17. //   string(2) "bb" 
  18. // } 

咦?我们定义的"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。

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

  1. a   = ['a']; 
  2. $a[2]  = 'b'
  3. $a[]  = 'c'
  4. $a['1'] = 'd'
  5.  
  6. // 以下循环的输出结果是? 
  7. foreach ($a as $v) { 
  8.     echo $v','
  9.  
  10. // 以下循环的输出结果是? 
  11. for ($i = 0; $i < count($a); ++$i) { 
  12.     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

Tags: PHP数组强制类型转换

分享到: