使用命名键比使用数字键慢得多,比使用标量变量还要慢:
<?php
$myArray = ['value_1' => 'value 1', 'value_2' => 'value 2', 'value_3' => 'value 3'];
$myArray2 = ['value 1', 'value 2', 'value 3'];
$tt = microtime(true);
for ($i = 0; $i<1e7; $i++) $x = $myArray['value_1'];
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;
$tt = microtime(true);
for ($i = 0; $i<1e7; $i++) $x = $myArray2[0];
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;
$tt = microtime(true);
$y = $myArray['value_1'];
for ($i = 0; $i<1e7; $i++) $x = $y;
$dt = microtime(true)-$tt;
echo $dt.PHP_EOL;
?>
给出:
0.80559897422791 // named key
0.74200701713562 // numeric key
0.54049301147461 // scalar
在循环中多次解引用数组,并且迭代次数很多,因此可能会很昂贵。但这主要适用于数字计算和类似的东西,在这方面 PHP 基本上不是最佳选择,因为它并不是为此设计的。
编辑有趣的是,在 Xeon 处理器上,从变量分配整数值比从标量整数分配快约 10-20%,而在 Intel i5 机器上没有区别。代码
here 给出了 Xeon 盒子的以下结果:
Accessing associative array 0.900
Accessing numerical array 0.794
Assigning from reference to associative array 0.662
Assigning a reference to an associative array element 0.877
Assigning scalar variable 0.499
Assigning scalar string 0.659
Assigning scalar integer 0.562
但这可能会因为寄存器使用而有所不同,取决于代码的大小。
$myArray['value1']
在这里无法使用,因为 value_1 是一个值,不是一个键。此外,还有第三种可能性:您可以在数组条目上放置引用:$value1 =& $myArray['key_1'];
。 - syck$myArray['value_1']
的初始值,而在第二个示例中对其进行了修改。这是不同的用例。 - Sablefoste$myArray['value_1']
,PHP的查找时间会更短。当直接使用时,它必须在数组内查找,否则它必须在变量中查找该值? - Yoram de Langen