代码之家  ›  专栏  ›  技术社区  ›  svec

PHP数组索引:$array[$index]vs$array[“$index”]vs$array[“{$index}”]

  •  25
  • svec  · 技术社区  · 18 年前

    这些索引到PHP数组的方法之间有什么区别(如果有的话):

    $array[$index]
    $array["$index"]
    $array["{$index}"]
    

    更新:

    (回应@Jeremy)我不确定这是否正确。我运行了以下代码:

      $array = array(100, 200, 300);
      print_r($array);
      $idx = 0;
      $array[$idx] = 123;
      print_r($array);
      $array["$idx"] = 456;
      print_r($array);
      $array["{$idx}"] = 789;
      print_r($array);
    

    Array
    (
        [0] => 100
        [1] => 200
        [2] => 300
    )
    
    Array
    (
        [0] => 123
        [1] => 200
        [2] => 300
    )
    
    Array
    (
        [0] => 456
        [1] => 200
        [2] => 300
    )
    
    Array
    (
        [0] => 789
        [1] => 200
        [2] => 300
    )
    
    7 回复  |  直到 6 年前
        1
  •  34
  •   justin justin    18 年前

    见上文@svec和@jeremy。所有数组索引的类型都是“int”型,然后是“string”型,并将在PHP认为合适时转换为该类型。

    一旦启动双引号字符串,PHP将进入插值模式并首先将其视为字符串,但会从局部范围中查找要替换的变量标记($,{},等等)。这就是为什么在大多数讨论中,真正的“静态”字符串应该始终是单引号,除非您需要“\n”或“\t”等转义快捷方式,因为PHP不需要在运行时尝试插入字符串,并且可以静态编译完整字符串。

        2
  •  29
  •   Markus Safar    10 年前

    我对使用索引的3种方式进行了计时,如下所示:

    for ($ii = 0; $ii < 1000000; $ii++) {
       // TEST 1
       $array[$idx] = $ii;
       // TEST 2
       $array["$idx"] = $ii;
       // TEST 3
       $array["{$idx}"] = $ii;
    }
    

    使用的第一组测试 $idx=0 $idx="0" ,使用第三套 $idx="blah" microtime() 差别。我正在使用WinXP、PHP5.2、Apache2.2和Vim.:-)

    结果如下:

    $idx = 0

    $array[$idx]            // time: 0.45435905456543 seconds
    $array["$idx"]          // time: 1.0537171363831 seconds
    $array["{$idx}"]        // time: 1.0621709823608 seconds
    ratio "$idx" / $idx     // 2.3191287282497
    ratio "{$idx}" / $idx   // 2.3377348193858
    

    $idx = "0"

    $array[$idx]            // time: 0.5107250213623 seconds
    $array["$idx"]          // time: 0.77445602416992 seconds
    $array["{$idx}"]        // time: 0.77329802513123 seconds
    ratio "$idx" / $idx     // = 1.5163855142717
    ratio "{$idx}" / $idx   // = 1.5141181512285
    

    使用 $idx = "blah"

    $array[$idx]           // time: 0.48077392578125 seconds
    $array["$idx"]         // time: 0.73676419258118 seconds
    $array["{$idx}"]       // time: 0.71499705314636 seconds
    ratio "$idx" / $idx    // = 1.5324545551923
    ratio "{$idx}" / $idx  // = 1.4871793473086
    

    所以 $array[$idx] 至少在我的机器上,他是性能竞赛的不折不扣的赢家。(结果非常重复,顺便说一句,我运行了3到4次,得到了相同的结果。)

        3
  •  7
  •   Akira    18 年前

    $array[“$index”]是 快于$array[$index]查看最佳

    不要盲目地相信你读到的一切。。。我想你误解了这一点。文章说$array['index']比索引为 一串 ,而不是一个变量。这是因为,如果不使用引号将其括起来,PHP将查找常量var,但找不到,因此假定您打算将其设为字符串。

        4
  •  6
  •   Markus Safar    10 年前

    根据 http://php.net/types.array ,数组索引只能是整数或字符串。如果您尝试使用浮点作为索引,它会将其截断为整数。所以如果 $index $array[$index] 将评估为 $array[3] $array["$index"] 将评估为 $array['3.14'] . 下面是一些代码来证实这一点:

    $array = array(3.14 => 'float', '3.14' => 'string');
    print_r($array);
    
    $index = 3.14;
    echo $array[$index]."\n";
    echo $array["$index"]."\n";
    

    Array([3] => float [3.14] => string)
    float
    string
    
        5
  •  1
  •   Community Mohan Dere    6 年前

    对更新的答复:

    $array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
    print_r($array);
    

    结果是:

    Array([1] => 300 [2] => 400)
    

    ejunker:

    你能解释一下为什么更快吗?解释器将“$index”解析到字符串中用作索引而不是仅使用$index作为索引,这难道不需要额外的步骤吗?

        6
  •  0
  •   Paige Ruten    18 年前

        7
  •  -6
  •   ejunker    18 年前

    我认为从性能角度来看,$array[“$index”]比$array[$index]快,请参见 Best practices to optimize PHP code performance

    当我在字符串中有一个数组时,我有时使用的另一个变体是:

    $str = "this is my string {$array["$index"]}";
    

    推荐文章