PHP是弱类型语言,就像JavaScript同样,在定义变量时,不须要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key便可以是普通的数字类型下标,也能够是字符串类型的Hash键值,那么,当一个数组的Key同时拥有字符串和数字时,会产生什么状况呢?php
首先来看下面这样一段代码:git
$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"了?github
没错,PHP中的数组Key值只接受数字和字符串类型,当Key是字符串时,会强强制转换为数字类型,遵照类型强制转换的规则。浮点数也是一样的道理,直接转换成了向下取整的整型。面试
那么"0.1"和"01"为何还在?首先,"01"不是标准的十进制数值,没法转换成整型,因此"01"仍是一个字符串下标,那"0.1"呢?它固然也不是一个标准的十进制数值。这里是违背了字符串转型数字的强制类型转换原则的,在变量的强制转换中,这两种字符串都会被转换为0,但在数组中则不会,这里会是一个坑,也是须要注意的地方。数组
在PHP官方文档中给出的Key值转换说明以下:测试
接下来,是笔者曾经作过的一道面试题,和这个类型转换有着很是大的关系,代码以下:.net
$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], ' ,'; }
你们先不要运行,直接看代码看看能不能看出这两段代码的输出结果会是什么,而后运行一下,看看结果和你想像的是否是同样。code
参考资料:blog
各自媒体平台都可搜索【硬核项目经理】