34

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

7 回答 7

34

参见上面的@svec 和@jeremy。所有数组索引的类型首先是“int”,然后是“string”类型,并且将在 PHP 认为合适的情况下转换为该类型。

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

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

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

于 2008-08-09T05:55:24.187 回答
29

我对使用这样的索引的 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、PHP 5.2、Apache 2.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 次,得到了相同的结果。)

于 2008-08-09T06:10:22.237 回答
7

我相信从性能的角度来看,$array["$index"] 比 $array[$index] 更快请参阅优化 PHP 代码性能的最佳实践

不要盲目相信您阅读的所有内容...我认为您误解了这一点。文章说 $array['index'] 比 $array[index] 快,其中 index 是一个字符串,而不是一个变量。那是因为如果你不把它用引号括起来,PHP 会寻找一个常量 var 并且找不到,所以假设你打算把它变成一个字符串。

于 2008-08-09T07:05:44.483 回答
6

不同的索引方法何时会解析为不同的索引?

根据http://php.net/types.array,数组索引只能是整数或字符串。如果您尝试使用浮点数作为索引,它会将其截断为整数。因此,如果$index是一个值为 3.14 的浮点数,那么$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
于 2008-08-09T06:30:12.010 回答
1

对更新的回应:

哦,你是对的,我猜如果数组索引字符串只包含数字,PHP 必须将它们转换为数字。我试过这段代码:

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

输出是:

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

我做了更多的测试,发现如果数组索引(或键)仅由数字组成,它总是转换为整数,否则它是一个字符串。

电子垃圾箱:

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

于 2008-08-09T05:48:21.487 回答
0

如果 $index 是一个字符串,则没有区别,因为 $index、"$index" 和 "{$index}" 都计算为相同的字符串。如果 $index 是一个数字,例如 10,则第一行的计算结果为 $array[10],其他两行的计算结果为 $array["10"],它是与 $array[10] 不同的元素。

于 2008-08-09T05:05:38.203 回答
-6

我相信从性能的角度来看,$array["$index"] 比 $array[$index] 更快请参阅优化 PHP 代码性能的最佳实践

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

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

编辑:我的意思是 $row['id'] 比 $row[id] 快

于 2008-08-09T05:30:38.450 回答