PHP是弱类型语言,就像JavaScript一样,在定义变量的时候,不需要强制指定变量的类型。同时,PHP具有强大的数组功能。数组的键可以是普通的数字类型下标,也可以是字符串类型的哈希键值。那么,当一个数组的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官方文档中给出的键值转换说明如下:包含合法整数值的字符串将被转换为整数。例如,键“8”实际上将存储为8。但是“08”不会被强制转换,因为它不是有效的十进制值。浮点数也被转换为整数,这意味着它们的小数部分被四舍五入。例如键8.7实际上会存储为8。布尔值也被转换为整数。即keytrue实际存储为1,keyfalse实际存储为0。null将转换为空字符串,即键名null实际存储为“”。数组和对象不能用作键。坚持这样做会导致警告:非法偏移类型。接下来是笔者曾经做过的一道面试题,跟这个类型转换有很大的关系。代码如下:$a=['a'];$a[2]='b';$a[]='c';$a['1']='d';//什么是以下循环的输出?foreach($aas$v){echo$v,',';}//以下循环的输出是什么?for($i=0;$i
