向阵列键添加前缀的最快方法?
向数组键添加字符串前缀的最快方法是什么?
输入
$array = array(
'1' => 'val1',
'2' => 'val2',
);
所需输出:
$array = array(
'prefix1' => 'val1',
'prefix2' => 'val2',
);
向数组键添加字符串前缀的最快方法是什么?
输入
$array = array(
'1' => 'val1',
'2' => 'val2',
);
所需输出:
$array = array(
'prefix1' => 'val1',
'prefix2' => 'val2',
);
我可以用一长串的词来做这个,我猜想:
$array = array_combine(
array_map(function($k){ return 'prefix'.$k; }, array_keys($array)),
$array
);
或者对于 5.3 之前的 PHP 版本:
$array = array_combine(
array_map(create_function('$k', 'return "prefix".$k;'), array_keys($array)),
$array
);
不过,可能有几十种方法可以做到这一点:
foreach ($array as $k => $v)
{
$array['prefix_'.$k] = $v;
unset($array[$k]);
}
我发现PHPBench不是一个很好的基准测试来源。因此,除非您真的对运行感兴趣,否则它不会正确显示哪种语法会更快。我整理了一个简单的基准测试,以表明当您在迭代期间同时使用键和值时,foreach实际上是最快的。for(....);
实际上强制PHP从循环迭代中读取值非常重要,否则它将尽最大努力优化它们。在下面的示例中,我使用该函数强制 PHP 每次计算键和值。使用 doNothing 将导致将开销应用于每个循环,但每个循环的开销都是相同的,因为调用数将相同。doNothing
我并不感到惊讶,因为它是迭代字典的语言结构。foreach
$array = range( 0, 1000000 );
function doNothing( $value, $key ) {;}
$t1_start = microtime(true);
foreach( $array as $key => $value ) {
doNothing( $value, $key );
}
$t1_end = microtime(true);
$t2_start = microtime(true);
$array_size = count( $array );
for( $key = 0; $key < $array_size; $key++ ) {
doNothing( $array[$key], $key );
}
$t2_end = microtime(true);
//suggestion from PHPBench as the "fastest" way to iterate an array
$t3_start = microtime(true);
$key = array_keys($array);
$size = sizeOf($key);
for( $i=0; $i < $size; $i++ ) {
doNothing( $key[$i], $array[$key[$i]] );
}
$t3_end = microtime(true);
$t4_start = microtime(true);
array_walk( $array, "doNothing" );
$t4_end = microtime(true);
print
"Test 1 ".($t1_end - $t1_start)."\n". //Test 1 0.342370986938
"Test 2 ".($t2_end - $t2_start)."\n". //Test 2 0.369848966599
"Test 3 ".($t3_end - $t3_start)."\n". //Test 3 0.78616809845
"Test 4 ".($t4_end - $t4_start)."\n"; //Test 4 0.542922019958
编辑:我在64位Mac OSX 10.6上使用PHP 5.3