为什么如下PHP数组执行print_r后输出为Array ( [1] => 4 )?
PHP数组键名覆盖逻辑说明
你给出的代码对应实际PHP实现如下:
<?php $array = [ 1 => "1", "1" => "2", 1.5 => "3", true => "4" ]; print_r($array);
输出结果为Array ( [1] => 4 )是由PHP数组的底层键名处理规则决定的,具体逻辑如下:
- 首先PHP数组会自动对非标准整数/字符串类型的键做强制类型转换,键名转换规则如下:
- 纯数字组成的字符串键会自动转换为对应的整数,例如字符串
"1"会被转为整数1 - 浮点数键会被向下取整为整数,例如浮点数
1.5会被转为整数1 - 布尔值键中
true会被转为整数1,false会被转为整数0
- 纯数字组成的字符串键会自动转换为对应的整数,例如字符串
- 其次数组相同键名重复赋值时,后写入的值会直接覆盖之前的旧值。
对应到代码里的四次赋值过程:
- 首次给整数键
1赋值"1",数组内容为[1 => "1"] - 给字符串键
"1"赋值"2",键自动转成1,覆盖旧值,数组内容变为[1 => "2"] - 给浮点数键
1.5赋值"3",键取整为1,再次覆盖,数组内容变为[1 => "3"] - 给布尔值键
true赋值"4",键转为1,最后一次覆盖,数组内容变为[1 => "4"]
最终print_r输出时就只剩下最后一次覆盖后的键值对。
内容的提问来源于stack exchange,提问作者Vinay SIngh
相关产品推荐
相关产品推荐

