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

2022-08-30 13:37:52

这些索引到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
)

答案 1

请参阅上面的@svec和@jeremy。所有数组索引都首先键入“int”,然后键入“string”,并将在PHP认为合适时强制转换为该类型。

在性能方面,$index应该比“$index”和“{$index}”(它们是相同的)更快。

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

在这种情况下,双引号将首先将$index复制到该字符串中,然后返回字符串,其中直接使用$index将仅返回字符串。


答案 2

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

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

使用了第一组测试,使用了第二组测试,使用了第三组测试。计时是使用 diffs 完成的。我使用的是WinXP,PHP 5.2,Apache 2.2和Vim。:-)$idx=0$idx="0"$idx="blah"microtime()

结果如下:

$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

性能竞赛的赢家也是如此,至少在我的机器上是这样。(结果非常可重复,顺便说一句,我运行了3或4次,得到了相同的结果。$array[$idx]


推荐