这些索引到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
)
答案 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]快