【问题标题】:Are PHP Integer array Indexes really numeric?PHP整数数组索引真的是数字吗?
【发布时间】:2013-05-25 14:13:16
【问题描述】:

考虑这个例子

<?php
    $test = array("00"=>"A","B","C","D","E");
    print_r($test);
    echo "<br>";

    echo $test[0];
    echo "<br>";
    echo $test["0"];
    echo "<br>";

    echo $test["00"];
    echo "<br>";
    echo $test[00];
?>

输出

数组([00] => A [0] => B [1] => C [2] => D [3] => E)

B

B

一个

B

Q1.为什么$test[0]$test["0"]相同,而$test[00]$test["00"]不同

Q2. 如果 Q1 的答案是因为00 = 0 的数字,那么为什么这个数组有一个索引为00 而另一个索引为0

Q3. 如果您无法使用$test[0] 访问$test["00"],那么您如何知道哪个索引是数字,哪个是字符串?如果两者都只是数字

编辑

根据目前的答案,我心中还有另一个问题。问题 4 来了。

Q4. 为什么if(00==0) 为真而if(07==7) 为假? (用于数组索引)

Q5。

$test = array("00"=>"A","0"=>"B","000"=>"C","0000"=>"D","00000"=>"E");
 echo $test[0];

为什么输出是B,不应该是A?因为这是数组中的第一个元素,在第 0 个位置

【问题讨论】:

    标签: php arrays numbers indexing


    【解决方案1】:

    根据文档,“[...] key 强制转换 [that] 将发生”之一是:

    包含有效integers 的Strings 将被转换为integer 类型。例如。 "8" 键实际上将存储在 8 下。另一方面,"08" 不会被强制转换,因为它不是有效的十进制整数。

    [link]

    【讨论】:

    • 但他们怎么能声明 08 与数学中的 8 不同呢? 08 应该是 8 的有效数值,为什么 00 等于 0 而 08 不等于 8
    • 这篇文档只说关于转换数组索引,它们需要是“有效的十进制整数”。 “0”是0,但“00”是一个字符串,00是一个整数0,所以它不会被强制转换。你的例子说明了一切。
    • 所以 Q4 的答案是 (07==7) 是真的!但是在数组索引方面是 "07"!=7
    • @fsw 如果你的论点被认为 00 是一个字符串,那么 PHP 为什么将它评估为 trueif(7=="07")
    • 因为 "07" 转换为 int 通常会给出 7 (php.net/manual/en/language.types.type-juggling.php) 但在数组索引方面有点不同(只有包含有效小数的字符串才会被转换)
    【解决方案2】:

    Q1.因为 00 = 0 数字

    Q2.因为索引是"00"而不是00

    试试:

    $test=array(00=>"A","B","C","D","E");
    print_r($test);
    
    /*
    Array
    (
        [0] => A
        [1] => B
        [2] => C
        [3] => D
        [4] => E
    )
    */
    

    第三季度。

    echo gettype("00");
    # string
    echo gettype(00);
    # integer
    echo gettype("0");
    # string
    echo gettype(0);
    # integer
    

    从手册: http://php.net/manual/en/language.types.array.php

    包含有效整数的字符串将被转换为整数类型。例如。键“8”实际上将存储在 8 之下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数。

    评论后编辑

    Q4。我认为 OP 的问题本质上是为什么第二个和第四个行为不同:

    php > var_dump("00" === 0);
    bool(false)
    php > var_dump(00 === 0);
    bool(true)
    php > var_dump("08" === 8);
    bool(false)
    php > var_dump(08 === 8);
    bool(false)
    

    我还没有答案。

    【讨论】:

    • 如果 0 和“0”之间没有区别,那么 00 和“00”有什么区别?
    • 但他们怎么能声明 08 与数学中的 8 不同呢? 08 应该是 8 的有效数值,为什么 00 等于 0 而 08 不等于 8
    • 以 0 开头的数字是八进制数,所以 010 == 8。08 是无效的八进制数,被解释为 0,所以 var_dump(08 == 0) 打印 bool(true)
    【解决方案3】:
    "anystring" == 0; //true
    "0000" == 0;      //true
    
    "0" == 0;      //true
    

    【讨论】:

    • 这是错误的。任何不以数字开头的字符串都会计算为零。换句话说,你的第三个陈述是错误的。 ("1" == 0); //false
    猜你喜欢
    • 2014-11-25
    • 2014-10-13
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2014-01-13
    • 2017-09-11
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多