【问题标题】:Problem with PHP array indexPHP数组索引的问题
【发布时间】:2011-07-04 21:38:50
【问题描述】:

以下代码:

<?php
$test_array = array();
$test_array['string_index'] = "data in string index";
$test_array[] = "data in index 0";
$test_array[] = "data in index 1";
$test_array[] = "data in index 2";

foreach($test_array as $key => $val)
{
    if($key != 'string_index')
    {
        echo $val."<br>";
    }
}
?>

给出结果:

data in index 1
data in index 2

问题是 - “索引 0 中的数据”在哪里???如何从数字索引 0-n 中获取元素? 此外,如果我将“string_index”更改为不存在的其他内容,它会回显除 [0] 之外的所有内容。请给我解释一下。

提前谢谢

【问题讨论】:

    标签: php arrays indexing


    【解决方案1】:

    这是因为“索引 0”数据的键为 0。在 PHP 中,0(数字零)、'0'(字符串零)和''(空字符串)都是等价的——它们可以进行类型转换对彼此。如果你只是完成print_r($test_array),你会得到

    Array
    (
        [string_index] => data in string index
        [0] => data in index 0
        [1] => data in index 1
        [2] => data in index 2
    )
    

    另一种选择是使用比较值和类型的严格不等式测试 (!==)。在这种情况下,0 !== 'string index' 的计算结果为 true,并且一切正常。

    评论跟进:

    如果您将循环内部更改为:

    echo "key: $key (", gettype($key), ") val: $val (", gettype($val), ")\n";
    if($key != 'string_index') {
        echo "$key != 'string_index'\n";
    } else {
        echo "$key == 'string_index'\n";
    }
    

    你会得到:

    key: string_index (string) val: data in string index (string)
    string_index == 'string_index'
    key: 0 (integer) val: data in index 0 (string)
    0 == 'string_index'
    key: 1 (integer) val: data in index 1 (string)
    1 != 'string_index'
    key: 2 (integer) val: data in index 2 (string)
    2 != 'string_index'
    

    如您所见,它们都在那里 - 是您的比较失败了,因为您没有考虑 PHP 的类型转换/转换规则。

    【讨论】:

    • 0 != 'string index' 的计算结果当然也为 true。没有针对空字符串的测试。
    • 但是 0 应该是!= 'string index'?我的意思是,没有理智的方式 php 可以将它们类型转换为相同的,可以吗?
    【解决方案2】:

    让我也困惑了一秒钟:)你只需要成功!==不是!=

    <?php
    $test_array = array();
    $test_array['string_index'] = "data in string index";
    $test_array[0] = "data in index 0";
    $test_array[] = "data in index 1";
    $test_array[] = "data in index 2";
    
    foreach($test_array as $key => $val)
    {
        if($key !== 'string_index')
        {
            echo $val."<br>";
        }
    }
    ?>
    

    这解决了你的问题。

    【讨论】:

      【解决方案3】:

      分别使用 === 或 !== 代替 ==, !=,您需要使用一些严格的比较运算符来验证类型转换。

       <?php
           $test_array = array();
           $test_array['string_index'] = "data in string index";
           $test_array[] = "data in index 0";
           $test_array[] = "data in index 1";
           $test_array[] = "data in index 2";
      
           foreach($test_array as $key => $val)
           {
              if($key ==='string_index')
              {
                 //do something
              }else{
                 echo $key.$val."<br>";
              }
           }
       ?>
      

      【讨论】:

        【解决方案4】:

        澄清一下:
        0 != 'string_index' 的原因是字符串显然在字符串/整数比较中“向下转换”为整数,并且 string_index 被解析直到遇到不是数字的字符,从而评估为等于的空字符串0.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多