标题:关于PHP数组Key的强制转换

文章目录
    分类:PHP 标签:PHP基础

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

    PHP是弱类型语言,就像JavaScript一样,在定义变量时,不需要强制指定变量的类型。同时,PHP又有着强大的数组功能,数组的Key即可以是普通的数字类型下标,也可以是字符串类型的Hash键值,那么,当一个数组的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官方文档中给出的Key值转换说明如下:

    • 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

    • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。

    • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。

    • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。

    • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

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

    
    $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

    视频链接

    B站视频地址:https://www.bilibili.com/video/BV15v411B7bK

    微信视频地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&amp;mid=2247484611&amp;idx=1&amp;sn=b08d0bc6b63e322c2bebaf3dd9187362&amp;chksm=97ebf562a09c7c74bb8c8ece52dd45c5f642e41cb41bff4c09b61aaab00560ab12166a663295&amp;scene=27#wechat_redirect

    微信文章地址:http://mp.weixin.qq.com/s?__biz=MzIxODQyNTU1MA==&amp;mid=2247484215&amp;idx=1&amp;sn=c2e8e1138a03e47f96c187af5af3256d&amp;chksm=97ebf296a09c7b801cd6fc7a2b839b2021851db461ca23c82691d4ce31c72f4caeeb40ad796c&amp;scene=27#wechat_redirect

    搜索
    关注