PHP 数组索引:$array[$index] vs $array[“$index”] vs $array[“{$index}”]
题
这些对 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] 更快