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

StackOverflow https://stackoverflow.com/questions/6628

  •  08-06-2019
  •  | 
  •  

这些对 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
)
有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

不要盲目相信你读到的一切......我认为你误解了这一点。文章说 $array['index'] 比 $array[index] 更快,其中索引是 细绳, ,不是变量。这是因为,如果您不将其括在引号中,PHP 会查找常量 var,但找不到,因此假设您打算将其设为字符串。

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

根据 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

对更新的响应:

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

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

输出是:

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

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

电子垃圾:

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top