zoukankan      html  css  js  c++  java
  • PHP数组关于数字键名的问题

    以下是对PHP数组数字键名的几点总结:

    键名长度只能在 int 长度范围内,超过int 范围后将会出现覆盖等混乱情况

    在键名长度为 int 范围内存取值时,PHP会强制将数字键名转换为 int 数值型

    数字键名长度大于19位时,将变成 0


    键名正常长度时,字符串或数值类型一样

    $i = 126545165;
    $arr['126545165'] = 'abc';
    $arr[126545165] = 'uio';
    var_dump($arr);
    echo '<br>';
    var_dump(isset($arr[$i]));




    长度超过整型时,键名混乱

    $i = 12312312312312;
    $arr['1000000000147483649'] = 'abc';
    $arr[1000000000147483649] = 'uio';
    var_dump($arr);
    echo '<br>';
    var_dump(isset($arr[$i]));





    长度超过20位时,键名将变成 0

    $i = 123123123123123123123123123123;
    var_dump($i);
    echo '<br>';
    $arr[123123123123123123123123123123] = 'abc';
    $arr[strval(123123123123123123123123123123)] = 'abc';
    var_dump($arr);
    echo '<br>';
    var_dump(isset($arr[$i]));
    echo '<br>';
    var_dump(isset($arr[strval($i)]));
    echo '<br>';
    var_dump(array_keys($arr));




    将变量直接作为键名存取,结果又有不同

    $i = 123123123123123;
    var_dump($i);
    echo '<br>';
    $arr[$i] = 'abc';
    $arr[strval($i)] = 'abc';
    var_dump($arr);
    echo '<br>';
    var_dump(isset($arr[$i]));
    echo '<br>';
    var_dump(isset($arr[strval($i)]));
    echo '<br>';
    var_dump(array_keys($arr));


    从上面的几种测试来看:

    如果键名为数字,且范围在 int 以内,字符串或者 int 不会对存取有什么影响

    如果长度大于 int 时会自动转化为 float ,再转换进行存取出现各种混乱情况,甚至直接变成 0,所以最好是统一转换为 string 类型


    $i = 123123123123123123123123123123;
    $j = '123123123123123123123123123123';
    $arr1[strval($i)] = 'abc';
    $arr2[$j] = 'abc';
    var_dump($arr1);
    echo '<br>';
    var_dump($arr2);




    所以在动态操作 PHP 数组时,如果不能确定键名是否会出现数字或者长度大于 int ,则统一将键名 strval 转换为 字符串来操作最为稳妥

  • 相关阅读:
    aws AWS CloudHSM
    aws Web server log analysis
    Monitor and Respond with AWS Config
    Amazon Cognito
    Amazon GuardDuty
    使用Reflactor反编译.Net程序的经验
    Windows Server 2008 25条常见问题
    解决C#读取EXCEL中数字无法读取的方法
    关于HOOK基础知识(windows API ,C++)
    Windows下Hook API 技术(HOOK SEND)
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758433.html
Copyright © 2011-2022 走看看