• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于PHP数组Key的强制类型转换

php 搞代码 3年前 (2022-03-01) 35次浏览 已收录 0个评论

PHP是弱类型语言,就像JavaScript一样,在定义变量时,不须要强制指定变量的类型。同时,PHP又有着弱小的数组性能,数组的Key即能够是一般的数字类型下标,也能够是字符串类型的Hash键值,那么,当一个数组的Key同时领有字符串和数字时,会产生什么状况呢?

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

<code class="php">
$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。

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

<code class="php">
$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/%E5%85%B3%E4%BA%8EPHP%E6%95%B0%E7%BB%84Key%E7%9A%84%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2.php

参考资料:

https://www.php.net/manual/zh/language.types.array.php

各自媒体平台均可搜寻【硬核项目经理】


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于PHP数组Key的强制类型转换

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址