zoukankan      html  css  js  c++  java
  • 关于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/关于PHP数组Key的强制转换.php

    参考资料: https://www.php.net/manual/zh/language.types.array.php
     
    文章转自:https://cloud.tencent.com/developer/article/1540566

  • 相关阅读:
    windows中dos命令指南
    HDU 2084 数塔 (dp)
    HDU 1176 免费馅饼 (dp)
    HDU 1004 Let the Balloon Rise (map)
    变态杀人狂 (数学)
    HDU 2717 Catch That Cow (深搜)
    HDU 1234 开门人和关门人 (模拟)
    HDU 1070 Milk (模拟)
    HDU 1175 连连看 (深搜+剪枝)
    HDU 1159 Common Subsequence (dp)
  • 原文地址:https://www.cnblogs.com/KillBugMe/p/13143661.html
Copyright © 2011-2022 走看看