为阵列键添加前缀的最快方法?

Kir*_*lla 35 php arrays

向数组键添加字符串前缀的最快方法是什么?

输入

$array = array(
 '1' => 'val1',
 '2' => 'val2',
);
Run Code Online (Sandbox Code Playgroud)

需要的输出:

$array = array(
  'prefix1' => 'val1',
  'prefix2' => 'val2',
);
Run Code Online (Sandbox Code Playgroud)

小智 58

我可以在一条长线上做到这一点:

$array = array_combine(
    array_map(function($k){ return 'prefix'.$k; }, array_keys($array)),
    $array
);
Run Code Online (Sandbox Code Playgroud)

或者对于5.3之前的PHP版本:

$array = array_combine(
    array_map(create_function('$k', 'return "prefix".$k;'), array_keys($array)),
    $array
);
Run Code Online (Sandbox Code Playgroud)

尽管如此,可能有很多方法可以做到这一点:

foreach ($array as $k => $v)
{
    $array['prefix_'.$k] = $v;
    unset($array[$k]);
}
Run Code Online (Sandbox Code Playgroud)

  • 无需将array_map()的array_values()设置为第二个参数。如果只是将数组扔进去,它将仍然使用该值。 (2认同)

Ken*_*ins 11

我发现PHPBench不是非平凡基准的非常好的来源.因此,除非您真正对运行for(....);它感兴趣,否则无法正确显示哪种语法会更快.我已经整理了一个简单的基准测试,以显示在迭代期间使用键和值时foreach实际上是最快的.

实际上强制PHP从循环迭代中读取值非常重要,否则它会尽力优化它们.在下面的示例中,我使用该doNothing函数强制PHP每次计算键和值.使用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
Run Code Online (Sandbox Code Playgroud)

编辑:我在64位Mac OSX 10.6上使用PHP 5.3


mis*_*lly 5

function keyprefix($keyprefix, Array $array) {

    foreach($array as $k=>$v){
        $array[$keyprefix.$k] = $v;
        unset($array[$k]);
    }

    return $array; 
}
Run Code Online (Sandbox Code Playgroud)

使用array_flip不会保留空值或空值.如果前缀键已经存在,则可以添加附加代码.