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

时间:2008-08-09 05:01:39

标签: php syntax

这些索引到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 个答案:

答案 0 :(得分:29)

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

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

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

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

答案 1 :(得分:24)

我定时使用这样的索引的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次,得到了相同的结果。)

答案 2 :(得分:6)

  

我相信表演   $ array [“$ index”]的观点是   快于$ array [$ index]见最佳   优化PHP代码的实践   性能

不要相信你所读到的一切......我认为你误解了这一点。文章说$ array ['index']比$ array [index]更快,其中index是字符串,而不是变量。那是因为如果你不用引号将它包装起来,那么PHP会查找一个常量变量而无法找到它,所以假设你想把它变成一个字符串。

答案 3 :(得分:5)

  

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

根据http://php.net/types.array,数组索引只能是整数或字符串。如果您尝试使用float作为索引,它会将其截断为整数。因此,如果$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

答案 4 :(得分:1)

对更新的回应:

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

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

输出结果为:

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

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

ejunker:

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

答案 5 :(得分:0)

如果$ index是一个字符串,则没有区别,因为$ index,“$ index”和“{$ index}”都评估为相同的字符串。如果$ index是一个数字,例如10,第一行将计算为$ array [10],另外两行将计算为$ array [“10”],这是与$ array [10]不同的元素。 / p>

答案 6 :(得分:-5)

从性能角度来看,我相信$ array [“$ index”]比$ array [$ index]更快见Best practices to optimize PHP code performance

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

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

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